home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1999 August / SGI Freeware 1999 August.iso / dist / fw_xemacs.idb / usr / freeware / lib / xemacs-20.4 / lisp / egg / egg-wnn.el.z / egg-wnn.el
Encoding:
Text File  |  1998-05-21  |  71.3 KB  |  2,029 lines

  1. ;;;  egg-wnn.el --- a inputting method communicating with [jck]server
  2.  
  3. ;; Author: Satoru Tomura (tomura@etl.go.jp), and
  4. ;;         Toshiaki Shingu (shingu@cpr.canon.co.jp)
  5. ;; Keywords: inputting method
  6.  
  7. ;; This file is part of Egg on Mule (Multilingual Environment)
  8.  
  9. ;; Egg is free software; you can redistribute it and/or modify
  10. ;; it under the terms of the GNU General Public License as published by
  11. ;; the Free Software Foundation; either version 2, or (at your option)
  12. ;; any later version.
  13.  
  14. ;; Egg is distributed in the hope that it will be useful,
  15. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. ;; GNU General Public License for more details.
  18.  
  19. ;; You should have received a copy of the GNU General Public License
  20. ;; along with GNU Emacs; see the file COPYING.  If not, write to
  21. ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  22.  
  23. ;;; Commentary:
  24.  
  25. ;;;  Modified to provide english strings as well by Jareth Hein (jareth@camelot-soft.com)
  26. ;;;  Modified for Wnn V4 and Wnn6 by Satoru Tomura(tomura@etl.go.jp)
  27. ;;;  Modified for Wnn6 by OMRON
  28. ;;;  Written by Toshiaki Shingu (shingu@cpr.canon.co.jp)
  29. ;;;  Modified for Wnn V4 library on wnn4v3-egg.el
  30.  
  31. ;;; $B$?$^$4!V$?$+$J!W%P!<%8%g%s(B
  32. ;;; $B!V$?$+$J!W$H$ODR$1J*$N$?$+$J$G$O$"$j$^$;$s!#(B
  33. ;;; $B!V$?$^$4$h!?$+$7$3$/!?$J!<!<$l!W$NN,$r$H$C$FL?L>$7$^$7$?!#(B
  34. ;;; Wnn V4 $B$N(B jl $B%i%$%V%i%j$r;H$$$^$9!#(B
  35. ;;; $B%i%$%V%i%j$H$N%$%s%?!<%U%'!<%9$O(B wnnfns.c $B$GDj5A$5$l$F$$$^$9!#(B
  36.  
  37. ;;;  $B=$@5%a%b(B
  38.  
  39. ;;;  97/10/27 Help system modification by J.Hein
  40. ;;;  97/2/4   Modified for use with XEmacs by J.Hein <jareth@camelot-soft.com>
  41. ;;;           (mostly changes regarding extents and markers)
  42. ;;;  94/2/3   kWnn support by H.Kuribayashi
  43. ;;;  93/11/24 henkan-select-kouho: bug fixed
  44. ;;;  93/7/22  hinsi-from-menu updated
  45. ;;;  93/5/12  remove-regexp-in-string 
  46. ;;;        fixed by Shuji NARAZAKI <narazaki@csce.kyushu-u.ac.jp>
  47. ;;;  93/4/22  set-wnn-host-name, set-cwnn-host-name
  48. ;;;  93/4/5   EGG:open-wnn, close-wnn modified by tsuiki.
  49. ;;;  93/4/2   wnn-param-set
  50. ;;;  93/4/2   modified along with wnn4fns.c
  51. ;;;  93/3/3   edit-dict-item: bug fixed
  52. ;;;  93/1/8   henkan-help-command modified.
  53. ;;;  92/12/1  buffer local 'wnn-server-type' and 'cwnn-zhuyin'
  54. ;;;     so as to support individual its mode with multiple buffers.
  55. ;;;  92/11/26 set-cserver-host-name fixed.
  56. ;;;  92/11/26 its:{previous,next}-mode by <yasutome@ics.osaka-u.ac.jp>
  57. ;;;  92/11/25 set-wnn-host-name was changed to set-{j,c}server-host-name.
  58. ;;;  92/11/25 redefined its:select-mode and its:select-mode-from-menu 
  59. ;;;    defined in egg.el to run hook with its mode selection.
  60. ;;;  92/11/20 bug fixed related to henkan mode attribute.
  61. ;;;  92/11/12 get-wnn-host-name and set-wnn-host-name were changed.
  62. ;;;  92/11/10 (set-dict-comment) bug fixed
  63. ;;;  92/10/27 (henkan-region-internal) display message if error occurs.
  64. ;;;  92/9/28 completely modified for chinese trandlation.
  65. ;;;  92/9/28 diced-{use,hindo-set} bug fixed <tetsuya@rabbit.is.s.u-tokyo.ac.jp>
  66. ;;;  92/9/22 touroku-henkan-mode by <tsuiki@sfc.keio.ac.jp>
  67. ;;;  92/9/18 rewrite wnn-dict-add to support password files.
  68. ;;;  92/9/8  henkan-region-internal was modified.
  69. ;;;  92/9/8  henkan-mode-map " "  'henkan-next-kouho-dai -> 'henkan-next-kouho
  70. ;;;  92/9/7  henkan-mode-map "\C-h" 'help-command -> 'henkan-help-command (Shuji Narazaki)
  71. ;;;  92/9/3  wnn-server-get-msg without wnn-error-code.
  72. ;;;  92/9/3  get-wnn-lang-name was modified.
  73. ;;;  92/8/19 get-wnn-lang-name $B$NJQ99(B (by T.Matsuzawa)
  74. ;;;  92/8/5  Bug in henkan-kakutei-first-char fixed. (by Y.Kasai)
  75. ;;;  92/7/17 set-egg-henkan-format $B$NJQ99(B
  76. ;;;  92/7/17 egg:error $B$N0z?t$r(B format &rest args $B$KJQ99(B
  77. ;;;  92/7/17 henkan/gyaku-henkan-word $B$N=$@5(B
  78. ;;;  92/7/17 henkan/gyaku-henkan-paragraph/sentence/word $B$G!"(B
  79. ;;;         $BI=<($,Mp$l$k$N$r=$@5!J(Bsave-excursion $B$r$O$:$9!K(B
  80. ;;;  92.7.14 Unnecessary '*' in comments of variables deleted. (by T.Ito)
  81. ;;;  92/7/10 henkan-kakutei-first-char $B$rDI2C!"(BC-@ $B$K3d$jEv$F!#(B(by K.Handa)
  82. ;;;  92/7/8  overwrite-mode $B$N%5%]!<%H(B(by K. Handa)
  83. ;;;  92/6/30 startup file $B<~$j$NJQ99(B
  84. ;;;  92/6/30 $BJQ49%b!<%I$N%"%H%j%S%e!<%H$K(B bold $B$rDI2C(B
  85. ;;;         (by ITO Toshiyuki <toshi@his.cpl.melco.co.jp>)
  86. ;;;  92/6/22 $B6uJ8;zNs$rJQ49$9$k$HMn$A$k%P%0$r=$@5(B
  87. ;;;  92/5/20 set-egg-henkan-mode-format $B$N(B bug fix
  88. ;;;  92/5/20 egg:set-bunsetu-attribute $B$,BgJ8@a$G@5$7$/F0$/$h$&$KJQ99(B
  89. ;;;  92/5/19 version 0
  90. ;;; ----------------------------------------------------------------
  91.  
  92. ;;; Code:
  93.  
  94. (require 'egg)
  95. (make-variable-buffer-local 'wnn-server-type)
  96. (make-variable-buffer-local 'cwnn-zhuyin)
  97.  
  98. (defvar egg:*sho-bunsetu-face* nil "*$B>.J8@aI=<($KMQ$$$k(B face $B$^$?$O(B nil")
  99. (make-variable-buffer-local
  100.  (defvar egg:*sho-bunsetu-extent* nil "$B>.J8@a$NI=<($K;H$&(B extent"))
  101.  
  102. (defvar egg:*sho-bunsetu-kugiri* "-" "*$B>.J8@a$N6h@Z$j$r<($9J8;zNs(B")
  103.  
  104. (defvar egg:*dai-bunsetu-face* nil "*$BBgJ8@aI=<($KMQ$$$k(B face $B$^$?$O(B nil")
  105. (make-variable-buffer-local
  106.  (defvar egg:*dai-bunsetu-extent* nil "$BBgJ8@a$NI=<($K;H$&(B extent"))
  107.  
  108. (defvar egg:*dai-bunsetu-kugiri* " " "*$BBgJ8@a$N6h@Z$j$r<($9J8;zNs(B")
  109.  
  110. (defvar egg:*henkan-face* nil "*$BJQ49NN0h$rI=<($9$k(B face $B$^$?$O(B nil")
  111. (make-variable-buffer-local
  112.  (defvar egg:*henkan-extent* nil "$BJQ49NN0h$NI=<($K;H$&(B extent"))
  113.  
  114. (defvar egg:*henkan-open*  "|" "*$BJQ49$N;OE@$r<($9J8;zNs(B")
  115. (defvar egg:*henkan-close* "|" "*$BJQ49$N=*E@$r<($9J8;zNs(B")
  116.  
  117. (defvar egg:henkan-mode-in-use nil)
  118.  
  119. ;;; ----------------------------------------------------------------
  120. ;;;    $B0J2<$N(B its mode $B4X78$N4X?t$O!"(Begg.el $B$GDj5A$5$l$F$$$k$,!"(B
  121. ;;; $B$?$+$J$G$O(B its mode $B$N@ZBX$($KF14|$7$F!"(Bjserver/cserver,
  122. ;;; pinyin/zhuyin $B$N@ZBX$($b9T$J$$$?$$$N$G!":FDj5A$7$F$$$k!#(B
  123. ;;; $B=>$C$F!"(Begg.el, egg-wnn.el $B$N=g$K%m!<%I$7$J$1$l$P$J$i$J$$!#(B
  124.  
  125.  
  126. (defun its:select-mode (name)
  127. "Switch ITS mode to NAME or prompt for it if called interactivly.
  128. After changing, its:select-mode-hook is called."
  129.   (interactive (list (completing-read "ITS mode: " its:*mode-alist*)))
  130.   (if (its:get-mode-map name)
  131.       (progn
  132.     (setq its:*current-map* (its:get-mode-map name))
  133.     (egg:mode-line-display)
  134.     (run-hooks 'its:select-mode-hook))
  135.     (beep))
  136.   )
  137.  
  138. (defun its:select-mode-from-menu ()
  139. "Select ITS mode from menu.
  140. After changing, its:select-mode-hook is called."
  141.   (interactive)
  142.   (setcar (nthcdr 2 its:*select-mode-menu*) its:*mode-alist*)
  143.   (setq its:*current-map* (menu:select-from-menu its:*select-mode-menu*))
  144.   (egg:mode-line-display)
  145.   (run-hooks 'its:select-mode-hook))
  146.  
  147. (defvar its:select-mode-hook
  148.   (function
  149.    (lambda ()
  150.      (cond ((eq its:*current-map* (its:get-mode-map "roma-kana"))
  151.         (setq wnn-server-type 'jserver))
  152.        ((eq its:*current-map* (its:get-mode-map "PinYin"))
  153.         (setq wnn-server-type 'cserver)
  154.         (setq cwnn-zhuyin nil))
  155.        ((eq its:*current-map* (its:get-mode-map "zhuyin"))
  156.         (setq wnn-server-type 'cserver)
  157.         (setq cwnn-zhuyin t))
  158.        ((eq its:*current-map* (its:get-mode-map "hangul"))
  159.         (setq wnn-server-type 'kserver))
  160.        ))))
  161.  
  162. (defun its:next-mode ()
  163. "Switch to next mode in list its:*standard-modes*
  164. After changing, its:select-mode-hook is called."
  165.   (interactive)
  166.   (let ((pos (its:find its:*current-map* its:*standard-modes*)))
  167.     (setq its:*current-map*
  168.       (nth (% (1+ pos) (length its:*standard-modes*))
  169.            its:*standard-modes*))
  170.     (egg:mode-line-display)
  171.     (run-hooks 'its:select-mode-hook)))
  172.  
  173. (defun its:previous-mode ()
  174. "Switch to previous mode in list its:*standard-modes*
  175. After changing, its:select-mode-hook is called."
  176.   (interactive)
  177.   (let ((pos (its:find its:*current-map* its:*standard-modes*)))
  178.     (setq its:*current-map*
  179.       (nth (1- (if (= pos 0) (length its:*standard-modes*) pos))
  180.            its:*standard-modes*))
  181.     (egg:mode-line-display)
  182.     (run-hooks 'its:select-mode-hook)))
  183.  
  184. (defun read-current-its-string (prompt &optional initial-input henkan)
  185.   (save-excursion
  186.     (let ((old-its-map its:*current-map*)
  187.       (minibuff (window-buffer (minibuffer-window))))
  188.       (set-buffer minibuff)
  189.       (setq egg:*input-mode* t
  190.         egg:*mode-on*    t
  191.         its:*current-map* old-its-map)
  192.       (mode-line-egg-mode-update
  193.        (nth 1 (its:get-mode-indicator its:*current-map*)))
  194.       (read-from-minibuffer prompt initial-input
  195.                 (if henkan nil
  196.                   egg:*minibuffer-local-hiragana-map*)))))
  197.  
  198. ;;;----------------------------------------------------------------------
  199. ;;;
  200. ;;; Kana Kanji Henkan 
  201. ;;;
  202. ;;;----------------------------------------------------------------------
  203.  
  204. (defvar wnn-host-name nil "Jserver host name currently connected")
  205. (defvar cwnn-host-name nil "Cserver host name currently connected")
  206. (defvar kwnn-host-name nil "Kserver host name currently connected")
  207. (defvar jserver-list nil "*List of jserver host name")
  208. (defvar cserver-list nil "*List of cserver host name")
  209. (defvar kserver-list nil "*List of kserver host name")
  210.  
  211. (defvar egg:*sai-henkan-start* nil)
  212. (defvar egg:*sai-henkan-end* nil)
  213. (defvar egg:*old-bunsetu-suu* nil)
  214.  
  215. (defun egg-wnn:kill-emacs-function ()
  216.   (let ((wnn-server-type))
  217.     (setq wnn-server-type 'jserver)
  218.     (close-wnn)
  219.     (setq wnn-server-type 'cserver)
  220.     (close-wnn)
  221.     (setq wnn-server-type 'kserver)
  222.     (close-wnn)))
  223.  
  224. (add-hook 'kill-emacs-hook 'egg-wnn:kill-emacs-function)
  225.  
  226. (defun egg:error (form &rest mesg)
  227.   (apply 'notify (or form "%s") mesg)
  228.   (apply 'error (or form "%s") mesg))
  229.  
  230. (defun wnn-toggle-english-messages ()
  231. "Toggle whether wnn reports info in english or the native language of the server."
  232.   (interactive)
  233.   (setq wnn-english-messages (not wnn-english-messages)))
  234.  
  235. (defvar wnn-english-messages nil "*If non-nil, display messages from the [jck]server in English")
  236.  
  237. (make-symbol "english-mess")
  238.  
  239. (defun egg:msg-get (message)
  240.   (or
  241.    (nth 1 (assoc message (nth 1 (assoc (if wnn-english-messages 'english-mess wnn-server-type)
  242.                        *egg-message-alist*))))
  243.    (format "No message. Check *egg-message-alist* %s %s"
  244.        wnn-server-type message)))
  245.  
  246. (defvar *egg-message-alist*
  247.   '((english-mess
  248.      ((open-wnn "Connected with Wnn on host %s")
  249.       (no-rcfile "No egg-startup-file on %s")
  250.       (file-saved "Wnn dictionary and frequency data recorded.")
  251.       (henkan-mode-indicator "$B4A(B")
  252.       (begin-henkan "Fence starting character: ")
  253.       (end-henkan "Fence ending character: ")
  254.       (kugiri-dai "Large bunsetsu separator: ")
  255.       (kugiri-sho "Small bunsetsu separator: ")
  256.       (face-henkan "Face for conversion: ")
  257.       (face-dai "Face for large bunsetsu: ")
  258.       (face-sho "Face for small bunsetsu: ")
  259.       (jikouho "Entries:")
  260.       (off-msg "%s %s(%s:%s) turned off.")
  261.       (henkan-help "Kanji conversion mode:
  262. Bunsetsu motion commands
  263.   \\[henkan-first-bunsetu]\tFirst bunsetsu\t\\[henkan-last-bunsetu]\tLast bunsetsu
  264.   \\[henkan-backward-bunsetu]\tPrevious bunsetsu\t\\[henkan-forward-bunsetu]\tNext bunsetsu
  265. Bunsetsu conversion commands
  266.   \\[henkan-next-kouho-dai]\tNext larger match\t\\[henkan-next-kouho-sho]\tNext smaller match
  267.   \\[henkan-previous-kouho]\tPrevious match\t\\[henkan-next-kouho]\tNext match
  268.   \\[henkan-bunsetu-nobasi-dai]\tExtend bunsetsu largest\t\\[henkan-bunsetu-chijime-dai]\tShrink bunsetsu smallest
  269.   \\[henkan-bunsetu-nobasi-sho]\tExtend bunsetsu\t\\[henkan-bunsetu-chijime-sho]\tShrink bunsetsu
  270.   \\[henkan-select-kouho-dai]\tMenu select largest match\t\\[henkan-select-kouho-sho]\tMenu select smallest match
  271. Conversion commands
  272.   \\[henkan-kakutei]\tComplete conversion commit\t\\[henkan-kakutei-before-point]\tCommit before point
  273.   \\[henkan-quit]\tAbort conversion
  274. ")
  275.       (hinsimei "Hinshi (product/noun) name:")
  276.       (jishotouroku-yomi "Dictionary entry for$B!X(B%s$B!Y(B reading:")
  277.       (touroku-jishomei "Name of dictionary:" )
  278.       (registerd "Dictonary entry$B!X(B%s$B!Y(B(%s: %s) registered in %s.")
  279.       (yomi "Reading$B!'(B")
  280.       (no-yomi "No dictionary entry for $B!X(B%s$B!Y(B.")
  281.       (jisho "Dictionary:")
  282.       (hindo "Frequency:")
  283.       (kanji "Kanji:")
  284.       (register-notify "Dictonary entry$B!X(B%s$B!Y(B(%s: %s) registered in %s.")
  285.       (cannot-remove "Cannot delete entry from system dictionary.")
  286.       (enter-hindo "Enter frequency:")
  287.       (remove-notify "Dictonary entry$B!X(B%s$B!Y(B(%s) removed from %s.")
  288.       (removed "Dictonary entry$B!X(B%s$B!Y(B(%s) removed from %s.")
  289.       (jishomei "Dictionary name:" )
  290.       (comment "Comment:")
  291.       (jisho-comment "Dictionary:%s: comment:%s")
  292.       (param ("$B#N(B ( $BBg(B ) $BJ8@a2r@O$N#N(B"
  293.           "$BBgJ8@aCf$N>.J8@a$N:GBg?t(B"
  294.           "$B448l$NIQEY$N%Q%i%a!<%?(B"
  295.           "$B>.J8@aD9$N%Q%i%a!<%?(B"
  296.           "$B448lD9$N%Q%i%a!<%?(B"
  297.           "$B:#;H$C$?$h%S%C%H$N%Q%i%a!<%?(B"
  298.           "$B<-=q$N%Q%i%a!<%?(B"
  299.           "$B>.J8@a$NI>2ACM$N%Q%i%a!<%?(B"
  300.           "$BBgJ8@aD9$N%Q%i%a!<%?(B"
  301.           "$B>.J8@a?t$N%Q%i%a!<%?(B"
  302.           "$B5?;wIJ;l(B $B?t;z$NIQEY(B"
  303.           "$B5?;wIJ;l(B $B%+%J$NIQEY(B"
  304.           "$B5?;wIJ;l(B $B1Q?t$NIQEY(B"
  305.           "$B5?;wIJ;l(B $B5-9f$NIQEY(B"
  306.           "$B5?;wIJ;l(B $BJD3g8L$NIQEY(B"
  307.           "$B5?;wIJ;l(B $BIUB08l$NIQEY(B"
  308.           "$B5?;wIJ;l(B $B3+3g8L$NIQEY(B"))
  309.       ))
  310.     (jserver
  311.      ((open-wnn "$B%[%9%H(B %s $B$N(B Wnn $B$r5/F0$7$^$7$?(B")
  312.       (no-rcfile "%s $B>e$K(B egg-startup-file $B$,$"$j$^$;$s!#(B")
  313.       (file-saved "Wnn$B$NIQEY>pJs!&<-=q>pJs$rB`Hr$7$^$7$?!#(B")
  314.       (henkan-mode-indicator "$B4A(B")
  315.       (begin-henkan "$BJQ493+;OJ8;zNs(B: ")
  316.       (end-henkan "$BJQ49=*N;J8;zNs(B: ")
  317.       (kugiri-dai "$BBgJ8@a6h@Z$jJ8;zNs(B: ")
  318.       (kugiri-sho "$B>.J8@a6h@Z$jJ8;zNs(B: ")
  319.       (face-henkan "$BJQ496h4VI=<(B0@-(B: ")
  320.       (face-dai "$BBgJ8@a6h4VI=<(B0@-(B: ")
  321.       (face-sho "$B>.J8@a6h4VI=<(B0@-(B: ")
  322.       (jikouho "$B<!8uJd(B:")
  323.       (off-msg "%s %s(%s:%s)$B$r(B off $B$7$^$7$?!#(B")
  324.       (henkan-help "$B4A;zJQ49%b!<%I(B:
  325. $BJ8@a0\F0(B
  326.   \\[henkan-first-bunsetu]\t$B@hF,J8@a(B\t\\[henkan-last-bunsetu]\t$B8eHxJ8@a(B  
  327.   \\[henkan-backward-bunsetu]\t$BD>A0J8@a(B\t\\[henkan-forward-bunsetu]\t$BD>8eJ8@a(B
  328. $BJQ49JQ99(B
  329.   \\[henkan-next-kouho-dai]\t$BBgJ8@a<!8uJd(B\t\\[henkan-next-kouho-sho]\t$B>.J8@a<!8uJd(B
  330.   \\[henkan-previous-kouho]\t$BA08uJd(B\t\\[henkan-next-kouho]\t$B<!8uJd(B    
  331.   \\[henkan-bunsetu-nobasi-dai]\t$BBgJ8@a?-$7(B\t\\[henkan-bunsetu-chijime-dai]\t$BBgJ8@a=L$a(B  
  332.   \\[henkan-bunsetu-nobasi-sho]\t$B>.J8@a?-$7(B\t\\[henkan-bunsetu-chijime-sho]\t$B>.J8@a=L$a(B  
  333.   \\[henkan-select-kouho-dai]\t$BBgJ8@aJQ498uJdA*Br(B\t\\[henkan-select-kouho-sho]\t$B>.J8@aJQ498uJdA*Br(B  
  334. $BJQ493NDj(B
  335.   \\[henkan-kakutei]\t$BA4J8@a3NDj(B\t\\[henkan-kakutei-before-point]\t$BD>A0J8@a$^$G3NDj(B  
  336.   \\[henkan-quit]\t$BJQ49Cf;_(B    
  337. ")
  338.       (hinsimei "$BIJ;lL>(B:")
  339.       (jishotouroku-yomi "$B<-=qEPO?!X(B%s$B!Y(B  $BFI$_(B :")
  340.       (touroku-jishomei "$BEPO?<-=qL>(B:" )
  341.       (registerd "$B<-=q9`L\!X(B%s$B!Y(B(%s: %s)$B$r(B%s$B$KEPO?$7$^$7$?!#(B" )
  342.       (yomi "$B$h$_!'(B")
  343. ;      (no-yomi "$B!X(B%s$B!Y$N<-=q9`L\$O$"$j$^$;$s!#(B")
  344.       (no-yomi "$B<-=q9`L\!X(B%s$B!Y$O$"$j$^$;$s!#(B")
  345.       (jisho "$B<-=q!'(B")
  346.       (hindo " $BIQEY!'(B")
  347.       (kanji "$B4A;z!'(B")
  348.       (register-notify "$B<-=q9`L\!X(B%s$B!Y(B(%s: %s)$B$r(B%s$B$KEPO?$7$^$9!#(B")
  349.       (cannot-remove "$B%7%9%F%`<-=q9`L\$O:o=|$G$-$^$;$s!#(B")
  350.       (enter-hindo "$BIQEY$rF~$l$F2<$5$$(B: ")
  351.       (remove-notify "$B<-=q9`L\(B%s(%s)$B$r(B%s$B$+$i:o=|$7$^$9!#(B")
  352.       (removed "$B<-=q9`L\(B%s(%s)$B$r(B%s$B$+$i:o=|$7$^$7$?!#(B")
  353.       (jishomei "$B<-=qL>(B:" )
  354.       (comment "$B%3%a%s%H(B: ")
  355.       (jisho-comment "$B<-=q(B:%s: $B%3%a%s%H(B:%s")
  356.       (param ("$B#N(B ( $BBg(B ) $BJ8@a2r@O$N#N(B"
  357.           "$BBgJ8@aCf$N>.J8@a$N:GBg?t(B"
  358.           "$B448l$NIQEY$N%Q%i%a!<%?(B"
  359.           "$B>.J8@aD9$N%Q%i%a!<%?(B"
  360.           "$B448lD9$N%Q%i%a!<%?(B"
  361.           "$B:#;H$C$?$h%S%C%H$N%Q%i%a!<%?(B"
  362.           "$B<-=q$N%Q%i%a!<%?(B"
  363.           "$B>.J8@a$NI>2ACM$N%Q%i%a!<%?(B"
  364.           "$BBgJ8@aD9$N%Q%i%a!<%?(B"
  365.           "$B>.J8@a?t$N%Q%i%a!<%?(B"
  366.           "$B5?;wIJ;l(B $B?t;z$NIQEY(B"
  367.           "$B5?;wIJ;l(B $B%+%J$NIQEY(B"
  368.           "$B5?;wIJ;l(B $B1Q?t$NIQEY(B"
  369.           "$B5?;wIJ;l(B $B5-9f$NIQEY(B"
  370.           "$B5?;wIJ;l(B $BJD3g8L$NIQEY(B"
  371.           "$B5?;wIJ;l(B $BIUB08l$NIQEY(B"
  372.           "$B5?;wIJ;l(B $B3+3g8L$NIQEY(B"))
  373.       ))
  374.     (cserver
  375.      ((open-wnn "Host %s $AIO5D(B cWnn $ARQ>-Fp6/AK(B")
  376.       (no-rcfile "$ATZ(B%s $AIOC;SP(B egg-startup-file")
  377.       (file-saved "Wnn$A5DF56HND<~:M4G5dPEO"RQ>-MK3vAK(B")
  378.       (henkan-mode-indicator "$A::(B")
  379.       (begin-henkan "$A1d;;?*J<WV7{AP(B: ")
  380.       (end-henkan "$A1d;;=aJxWV7{AP(B: ")
  381.       (kugiri-dai "$A4JWi7V8nWV7{AP(B: ")
  382.       (kugiri-sho "$A5%4J7V8nWV7{AP(B: ")
  383.       (face-henkan "$A1d;;Gx<d1mJ>JtPT(B: ")
  384.       (face-dai "$A4JWiGx<d1mJ>JtPT(B: ")
  385.       (face-sho "$A5%4JGx<d1mJ>JtPT(B: ")
  386.       (jikouho "$A4N:nQ!(B:")
  387.       (off-msg "%s %s(%s:%s)$ARQ1;(B off $A5tAK(B")
  388.       (henkan-help "$A::WV1d;;D#J=(B:
  389. $A4JWiRF6/(B
  390.   \\[henkan-first-bunsetu]\t$AOHM74JWi(B\t\\[henkan-last-bunsetu]\t$A=aN24JWi(B
  391.   \\[henkan-backward-bunsetu]\t$AG0R;8v4JWi(B\t\\[henkan-forward-bunsetu]\t$AOBR;8v4JWi(B
  392. $A1d;;1d8|(B
  393.   \\[henkan-next-kouho-dai]\t$A4JWi4N:nQ!(B\t\\[henkan-next-kouho-sho]\t$A5%4J4N:nQ!(B
  394.   \\[henkan-previous-kouho]\t$AG0:nQ!(B\t\\[henkan-next-kouho]\t$A4N:nQ!(B
  395.   \\[henkan-bunsetu-nobasi-dai]\t$A4JWi@)U9(B\t\\[henkan-bunsetu-chijime-dai]\t$A4JWiJUKu(B
  396.   \\[henkan-bunsetu-nobasi-sho]\t$A5%4J@)U9(B\t\\[henkan-bunsetu-chijime-sho]\t$A5%4JJUKu(B
  397.   \\[henkan-select-kouho-dai]\t$A4JWi1d;;:r295DQ!Tq(B\t\\[henkan-select-kouho-sho]\t$A5%4J1d;;:r295DQ!Tq(B
  398.   \\[henkan-select-kouho-dai]\t$A1d;;:r295DQ!Tq(B
  399. $A1d;;H76((B
  400.   \\[henkan-kakutei]\t$AH+NDH76((B\t\\[henkan-kakutei-before-point]\t$AIOR;4JWiN*V95DH76((B
  401.   \\[henkan-quit]\t$AM#V91d;;(B
  402. ")
  403.       (hinsimei "$A4JPTC{(B:")
  404.       (jishotouroku-yomi "$A4G5d5GB<!:(B%s$A!;F47((B :")
  405.       (touroku-jishomei "$A5GB<4G5dC{(B:" )
  406.       (registerd "$A4G5dOnD?!:(B%s$A!;(B(%s: %s)$ARQ1;5GB<5=(B %s $AVPAK(B" )
  407.       (yomi "$AF47($B!'(B")
  408. ;      (no-yomi "$A!:(B%s$A!;5D4G5dOnD?2;4fTZ(B")
  409.       (no-yomi "$A4G5dOnD?!:(B%s$A!;2;4fTZ(B")
  410.       (jisho "$A4G5d(B:")
  411.       (hindo " $AF56H$B!'(B")
  412.       (kanji "$A::WV$B!'(B")
  413.       (register-notify "$A4G5dOnD?!:(B%s$A!;(B(%s: %s)$A=+R*1;5GB<5=(B %s $AVP(B")
  414.       (cannot-remove "$AO5M34G5dOn2;D\O{3}(B")
  415.       (enter-hindo "$AGkJdHkF56H(B: ")
  416.       (remove-notify "$A4G5dOnD?(B%s(%s)$A=+R*4S(B %s $AVPO{3}(B")
  417.       (removed "$A4G5dOnD?(B%s(%s)$ARQ>-4S(B%s$AVPO{3}AK(B")
  418.       (jishomei "$A4G5dC{(B:" )
  419.       (comment "$AW"JM(B: ")
  420.       (jisho-comment "$A4G5d(B:%s: $AW"JM(B:%s")
  421.       (param ("$A=bNv4JWi8vJ}(B"
  422.           "$A4JWiVP4J5DWn4s8vJ}(B"
  423.           "$AF56HH(V5(B"
  424.           "$A4J3$6HH(V5(B"
  425.           "$AKDIyU}H76HH(V5(B"
  426.           "$A8U2ESC9}H(V5(B"
  427.           "$AWV5dSEOH<6H(V5(B"
  428.           "$A4JF@<[>yV5H(V5(B"
  429.           "$A4JWi3$H(V5(B"
  430.           "$A4JWiVP4JJ}H(V5(B"
  431.           "$AJ}WV5DF56H(B"
  432.           "$AS"NDWVD85DF56H(B"
  433.           "$A<G:E5DF56H(B"
  434.           "$A?*@(;!5DF56H(B"
  435.           "$A1U@(;!5DF56H(B"
  436.           "$AWn4s:r298vJ}(B"
  437.           "$A18SC(B"
  438.           ))
  439.       ))
  440.     (kserver
  441.      ((open-wnn "$(CH#=:F.(B %s $(C@G(B kWnn $(C8&(B $(CQ&TQG_@>4O4Y(B.")
  442.       (no-rcfile "%s $(C?!(B egg-startup-file $(C@L(B $(C>x@>4O4Y(B.")
  443.       (file-saved "kWnn $(C@G(B $(C^:SxoW\C!$^vnpoW\C8&(B $(C?E0e@>4O4Y(B.")
  444.       (henkan-mode-indicator "$(CyS(B")
  445.       (begin-henkan "$(C\(|5(B $(CKRc7(B $(CY~m.fj(B: ")
  446.       (end-henkan "$(C\(|5(B $(Cp{Vu(B $(CY~m.fj(B: ")
  447.       (kugiri-dai "$(CS^Y~o=(B $(CO!\,(B $(CY~m.fj(B: ")
  448.       (kugiri-sho "$(Ca3Y~o=(B $(CO!\,(B $(CY~m.fj(B: ")
  449.       (face-henkan "$(C\(|5(B $(CO!J`(B $(CxvcF(B $(CaU`u(B: ")
  450.       (face-dai "$(CS^Y~o=(B $(CO!J`(B $(CxvcF(B $(CaU`u(B: ")
  451.       (face-sho "$(Ca3Y~o=(B $(CO!J`(B $(CxvcF(B $(CaU`u(B: ")
  452.       (jikouho "$(C4Y@=(B $(C}&\M(B:")
  453.       (off-msg "%s %s(%s:%s)$(C@;(B off $(CG_@>4O4Y(B.")
  454.       (henkan-help "$(CySm.(B $(C\(|5(B $(C8p5e(B:
  455. $(CY~o=(B $(Cl9TQ(B
  456.   \\[henkan-first-bunsetu]\t$(C`;Ti(B $(CY~o=(B\t\\[henkan-last-bunsetu]\t$(C}-Z-(B $(CY~o=(B  
  457.   \\[henkan-backward-bunsetu]\t$(CrAnq(B $(CY~o=(B\t\\[henkan-forward-bunsetu]\t$(CrA}-(B $(CY~o=(B
  458. $(C\(|5(B $(C\(LZ(B
  459.   \\[henkan-next-kouho-dai]\t$(CS^Y~o=(B $(C4Y@=(B $(C}&\M(B\t\\[henkan-next-kouho-sho]\t$(Ca3Y~o=(B $(C4Y@=(B $(C}&\M(B    
  460.   \\[henkan-previous-kouho]\t$(Cnq(B $(C}&\M(B\t\\[henkan-next-kouho]\t$(C4Y@=(B $(C}&\M(B
  461.   \\[henkan-bunsetu-nobasi-dai]\t$(CS^Y~o=(B $(C|*S^(B\t\\[henkan-bunsetu-chijime-dai]\t$(CS^Y~o=(B $(Cuja3(B
  462.   \\[henkan-bunsetu-nobasi-sho]\t$(Ca3Y~o=(B $(C|*S^(B\t\\[henkan-bunsetu-chijime-sho]\t$(Ca3Y~o=(B $(Cuja3(B
  463.   \\[henkan-select-kouho-dai]\t$(CS^Y~o=(B $(C\(|5(B $(C4Y@=(B $(C}&\M(B\t\\[henkan-select-kouho-sho]\t$(Ca3Y~o=(B $(C\(|5(B $(C4Y@=(B $(C}&\M(B
  464. $(C\(|5(B $(C|,oR(B
  465.   \\[henkan-kakutei]\t$(CnoY~o=(B $(C|,oR(B\t\\[henkan-kakutei-before-point]\t$(CrAnq(B $(CY~o=1nAv(B $(C|,oR(B
  466.   \\[henkan-quit]\t$(C\(|5(B $(Cqir-(B
  467. ")
  468.       (hinsimei "$(Cy!^rY#(B: ")
  469.       (jishotouroku-yomi "$(C^vnp(B $(CTtVb!:(B%s$(C!;(B $(CGQ1[(B: ")
  470.       (touroku-jishomei "$(CTtVb(B $(C^vnpY#(B: " )
  471.       (registerd "$(C^vnp(B $(Cz#YM!:(B%s$(C!;(B(%s: %s)$(C@;(B %s$(C?!(B $(CTtVbG_@>4O4Y(B." )
  472.       (yomi "$(CGQ1[(B: ")
  473. ;      (no-yomi "$(C!:(B%s$(C!;@G(B $(C^vnp(B $(Cz#YM@L(B $(C>x@>4O4Y(B.")
  474.       (no-yomi "$(C^vnp(B $(Cz#YM(B $(C!:(B%s$(C!;@L(B $(C>x@>4O4Y(B.")
  475.       (jisho "$(C^vnp(B: ")
  476.       (hindo " $(C^:Sx(B: ")
  477.       (kanji "$(CySm.(B: ")
  478.       (register-notify "$(C^vnp(B $(Cz#YM(B $(C!:(B%s$(C!;(B(%s: %s)$(C@;(B %s$(C?!(B $(CTtVbGO0Z@>4O4Y(B.")
  479.       (cannot-remove "$(C=C=:E[(B $(C^vnpz#YM@:(B $(Ca<K[GR(B $(C<v(B $(C>x@>4O4Y(B.")
  480.       (enter-hindo "$(C^:Sx8&(B $(Cl}UtGO=J=C?@(B: ")
  481.       (remove-notify "$(C^vnpz#YM(B %s(%s)$(C@;(B %s$(C:NEM(B $(Ca<K[GO0Z@>4O4Y(B.")
  482.       (removed "$(C^vnp(B $(Cz#YM(B %s(%s)$(C@;(B %s$(C:NEM(B $(Ca<K[G_@>4O4Y(B.")
  483.       (jishomei "$(C^vnpY#(B: " )
  484.       (comment "$(CqI`7(B: ")
  485.       (jisho-comment "$(C^vnp(B:%s: $(CqI`7(B:%s")
  486.       (param ("N ($(CS^(B)$(CY~o=(B $(Cz0`0@G(B N"
  487.           "$(CS^Y~o=(B $(C>H@G(B $(Ca3Y~o=(B $(C<v@G(B $(CuLS^b&(B"
  488.           "$(CJOe^@G(B $(C^:Sx(B $(CFP7/9LEM(B"
  489.           "$(Ca3Y~o=(B $(C1f@L(B $(CFP7/9LEM(B"
  490.           "$(CJOe^@G(B $(C1f@L(B $(CFP7/9LEM(B"
  491.           "$(Cq~PQ(B $(C^EiDG_@>4O4Y(B $(C:qF.(B $(CFP7/9LEM(B"
  492.           "$(C^vnp@G(B $(CFP7/9LEM(B"
  493.           "$(Ca3Y~o=@G(B $(CxDJ$v7(B $(CFP7/9LEM(B"
  494.           "$(CS^Y~o=(B $(C1f@L(B $(CFP7/9LEM(B"
  495.           "$(Ca3Y~o=(B $(Cb&(B $(CFP7/9LEM(B"
  496.           "$(CJ#_L(B $(Cy!^r(B: $(Cb&m.@G(B $(C^:Sx(B"
  497.           "$(CJ#_L(B $(Cy!^r(B: $(CGQ1[@G(B $(C^:Sx(B"
  498.           "$(CJ#_L(B $(Cy!^r(B: $(CgHb&m.@G(B $(C^:Sx(B"
  499.           "$(CJ#_L(B $(Cy!^r(B: $(CQ@{\@G(B $(C^:Sx(B"
  500.           "$(CJ#_L(B $(Cy!^r(B: $(CxMN@{A@G(B $(C^:Sx(B"
  501.           "$(CJ#_L(B $(Cy!^r(B: $(C]>aUe^@G(B $(C^:Sx(B"
  502.           "$(CJ#_L(B $(Cy!^r(B: $(CKRN@{A@G(B $(C^:Sx(B"))
  503.       ))
  504.     ))
  505.  
  506.  
  507. ;;;
  508. ;;; Entry functions for egg-startup-file
  509. ;;;
  510.  
  511. ;(defvar wnn-lang-name nil)
  512. ;(defvar default-wnn-lang-name "ja_JP")    ; 92.8.19 by T.Matsuzawa
  513.  
  514. (defvar skip-wnn-setenv-if-env-exist nil
  515.   "skip wnn environment setting when the same name environment exists")
  516.  
  517. (defmacro push-end (val loc)
  518.   (list 'push-end-internal val (list 'quote loc)))
  519.  
  520. (defun push-end-internal (val loc)
  521.   (set loc
  522.        (if (eval loc)
  523.        (nconc (eval loc) (cons val nil))
  524.      (cons val nil))))
  525.  
  526. (defun is-wnn6-server ()
  527.   (= (wnn-server-version) 61697))
  528.  
  529. (defun add-wnn-dict (dfile hfile priority dmode hmode &optional dpaswd hpaswd)
  530. ;  (open-wnn-if-disconnected)
  531.   (if (null (wnn-server-dict-add
  532.          (substitute-in-file-name dfile)
  533.          (substitute-in-file-name hfile)
  534.          priority dmode hmode dpaswd hpaswd))
  535.       (egg:error (wnn-server-get-msg))))
  536.  
  537. (defun set-wnn-fuzokugo (ffile)
  538. ;  (open-wnn-if-disconnected)
  539.   (if (null (wnn-server-fuzokugo-set (substitute-in-file-name ffile)))
  540.       (egg:error (wnn-server-get-msg))))
  541.  
  542. ;; ###jhod Currently very broken. Needs to be rewritten for the new
  543. ;;         wnn-server-set-param
  544. (defun set-wnn-param (&rest param)
  545. "Set parameters for the current wnn session.
  546. Uses property list PARAM, or prompts if called interactivly.
  547.  
  548. Currently very broken."
  549.   (interactive)
  550. ;  (open-wnn-if-disconnected)
  551.   (let ((current-param (wnn-server-get-param))
  552.     (new-param)
  553.     (message (egg:msg-get 'param)))
  554.     (while current-param
  555.       (setq new-param
  556.         (cons
  557.          (if (or (null param) (null (car param)))
  558.          (string-to-int
  559.           (read-from-minibuffer (concat (car message) ": ")
  560.                     (int-to-string (car current-param))))
  561.            (car param))
  562.          new-param))
  563.       (setq current-param (cdr current-param)
  564.         message (cdr message)
  565.         param (if param (cdr param) nil)))
  566.     (apply 'wnn-server-set-param (nreverse new-param))))
  567.  
  568. ;;
  569. ;; for Wnn6
  570. ;;
  571. (defun add-wnn-fisys-dict (dfile hfile hmode &optional hpaswd)
  572. ;  (open-wnn-if-disconnected)
  573.   (if (null (wnn-server-fisys-dict-add
  574.              (substitute-in-file-name dfile)
  575.              (substitute-in-file-name hfile)
  576.              hmode hpaswd))
  577.       (egg:error (wnn-server-get-msg))))
  578.  
  579. (defun add-wnn-fiusr-dict (dfile hfile dmode hmode &optional dpaswd hpaswd)
  580. ;  (open-wnn-if-disconnected)
  581.   (if (null (wnn-server-fiusr-dict-add
  582.              (substitute-in-file-name dfile)
  583.              (substitute-in-file-name hfile)
  584.              dmode hmode dpaswd hpaswd))
  585.       (egg:error (wnn-server-get-msg))))
  586.  
  587. (defun add-wnn-notrans-dict (dfile priority dmode &optional dpaswd)
  588. ;  (open-wnn-if-disconnected)
  589.   (if (null (wnn-server-notrans-dict-add
  590.              (substitute-in-file-name dfile)
  591.              priority dmode dpaswd))
  592.       (egg:error (wnn-server-get-msg))))
  593.  
  594. (defun add-wnn-bmodify-dict (dfile priority dmode &optional dpaswd)
  595. ;  (open-wnn-if-disconnected)
  596.   (if (null (wnn-server-bmodify-dict-add
  597.              (substitute-in-file-name dfile)
  598.              priority dmode dpaswd))
  599.       (egg:error (wnn-server-get-msg))))
  600.  
  601. (defun set-last-is-first-mode (mode)
  602. ;  (open-wnn-if-disconnected)
  603.   (if (null (wnn-server-set-last-is-first
  604.              mode))
  605.       (egg:error (wnn-server-get-msg))))
  606.  
  607. (defun set-complex-conv-mode (mode)
  608. ;  (open-wnn-if-disconnected)
  609.   (if (null (wnn-server-set-complex-conv-mode
  610.              mode))
  611.       (egg:error (wnn-server-get-msg))))
  612.  
  613. (defun set-okuri-learn-mode (mode)
  614. ;  (open-wnn-if-disconnected)
  615.   (if (null (wnn-server-set-okuri-learn-mode
  616.              mode))
  617.       (egg:error (wnn-server-get-msg))))
  618.  
  619. (defun set-okuri-flag (mode)
  620. ;  (open-wnn-if-disconnected)
  621.   (if (null (wnn-server-set-okuri-flag
  622.              mode))
  623.       (egg:error (wnn-server-get-msg))))
  624.  
  625. (defun set-prefix-learn-mode (mode)
  626. ;  (open-wnn-if-disconnected)
  627.   (if (null (wnn-server-set-prefix-learn-mode
  628.              mode))
  629.       (egg:error (wnn-server-get-msg))))
  630.  
  631. (defun set-prefix-flag (mode)
  632. ;  (open-wnn-if-disconnected)
  633.   (if (null (wnn-server-set-prefix-flag
  634.              mode))
  635.       (egg:error (wnn-server-get-msg))))
  636.  
  637. (defun set-suffix-learn-mode (mode)
  638. ;  (open-wnn-if-disconnected)
  639.   (if (null (wnn-server-set-suffix-learn-mode
  640.              mode))
  641.       (egg:error (wnn-server-get-msg))))
  642.  
  643. (defun set-common-learn-mode (mode)
  644. ;  (open-wnn-if-disconnected)
  645.   (if (null (wnn-server-set-common-learn-mode
  646.              mode))
  647.       (egg:error (wnn-server-get-msg))))
  648.  
  649. (defun set-freq-func-mode (mode)
  650. ;  (open-wnn-if-disconnected)
  651.   (if (null (wnn-server-set-freq-func-mode
  652.              mode))
  653.       (egg:error (wnn-server-get-msg))))
  654.  
  655. (defun set-numeric-mode (mode)
  656. ;  (open-wnn-if-disconnected)
  657.   (if (null (wnn-server-set-numeric-mode
  658.              mode))
  659.       (egg:error (wnn-server-get-msg))))
  660.  
  661. (defun set-alphabet-mode (mode)
  662. ;  (open-wnn-if-disconnected)
  663.   (if (null (wnn-server-set-alphabet-mode
  664.              mode))
  665.       (egg:error (wnn-server-get-msg))))
  666.  
  667. (defun set-symbol-mode (mode)
  668. ;  (open-wnn-if-disconnected)
  669.   (if (null (wnn-server-set-symbol-mode
  670.              mode))
  671.       (egg:error (wnn-server-get-msg))))
  672.  
  673. (defun set-yuragi-mode (mode)
  674. ;  (open-wnn-if-disconnected)
  675.   (if (null (wnn-server-set-yuragi-mode
  676.              mode))
  677.       (egg:error (wnn-server-get-msg))))
  678.  
  679. (defun wnn6-reset-prev-info ()
  680. ;  (open-wnn-if-disconnected)
  681.   (if (null (wnn-reset-previous-info))
  682.       (egg:error (wnn-server-get-msg))))
  683.  
  684. ;;;
  685. ;;; WNN interface
  686. ;;;
  687.  
  688. (defun make-host-list (name list)
  689.   (cons name (delete name list)))
  690.  
  691. (defun set-wnn-host-name (name)
  692. "Set egg/wnn to connect to jserver on host NAME, or prompt for it."
  693.   (interactive "sHost name: ")
  694.   (let ((wnn-server-type 'jserver)) (close-wnn))
  695.   (setq jserver-list
  696.     (make-host-list
  697.      name (or jserver-list (list (or wnn-host-name (getenv "JSERVER") "localhost"))))))
  698.  
  699. (fset 'set-jserver-host-name (symbol-function 'set-wnn-host-name))
  700.  
  701. (defun set-cwnn-host-name (name)
  702. "Set egg/wnn to connect to cserver on host NAME, or prompt for it."
  703.   (interactive "sHost name: ")
  704.   (let ((wnn-server-type 'cserver)) (close-wnn))
  705.   (setq cserver-list
  706.     (make-host-list
  707.      name (or cserver-list (list (or cwnn-host-name (getenv "CSERVER") "localhost"))))))
  708.  
  709. (fset 'set-cserver-host-name (symbol-function 'set-cwnn-host-name))
  710.  
  711. (defun set-kwnn-host-name (name)
  712. "Set egg/wnn to connect to kserver on host NAME, or prompt for it."
  713.   (interactive "sHost name: ")
  714.   (let ((wnn-server-type 'kserver)) (close-wnn))
  715.   (setq kserver-list
  716.     (make-host-list
  717.      name (or kserver-list (list (or kwnn-host-name (getenv "KSERVER") "localhost"))))))
  718.  
  719. (fset 'set-kserver-host-name (symbol-function 'set-kwnn-host-name))
  720.  
  721. (defun open-wnn-if-disconnected ()
  722.   (if (null (wnn-server-isconnect))
  723.       (let ((hostlist
  724.          (cond ((eq wnn-server-type 'jserver)
  725.             (or jserver-list
  726.             (list (or wnn-host-name (getenv "JSERVER") "localhost"))))
  727.            ((eq wnn-server-type 'cserver)
  728.             (or cserver-list
  729.             (list (or cwnn-host-name (getenv "CSERVER") "localhost"))))
  730.            ((eq wnn-server-type 'kserver)
  731.             (or kserver-list
  732.             (list (or kwnn-host-name (getenv "KSERVER") "localhost"))))))
  733.         (loginname (user-login-name)))
  734.     (catch 'succ
  735.       (while hostlist
  736.         (let ((hostname (car hostlist)))
  737.           (if (wnn-server-open hostname loginname)
  738.           (progn
  739.             (cond ((eq wnn-server-type 'jserver)
  740.                (setq wnn-host-name hostname))
  741.               ((eq wnn-server-type 'cserver)
  742.                (setq cwnn-host-name hostname))
  743.               ((eq wnn-server-type 'kserver)
  744.                (setq kwnn-host-name hostname)))
  745.             (throw 'succ hostname))))
  746.         (setq hostlist (cdr hostlist)))
  747.       (egg:error (wnn-server-get-msg))))))
  748.     
  749. (defvar egg-default-startup-file "eggrc"
  750.   "*Egg startup file name (system default)")
  751.  
  752. (defvar egg-startup-file ".eggrc"
  753.   "*Egg startup file name.")
  754.  
  755. ;;;  92/6/30, by K.Handa
  756. (defvar egg-startup-file-search-path '("~" ".")
  757.   "*List of directories to search for egg-startup-file
  758. whose name defaults to .eggrc.")
  759.  
  760. (defun egg:search-file (filename searchpath)
  761.   (if (file-name-directory filename)
  762.       (let ((file (substitute-in-file-name (expand-file-name filename))))
  763.     (if (file-exists-p file) file nil))
  764.     (catch 'answer
  765.       (while searchpath
  766.     (let ((path (car searchpath)))
  767.       (if (stringp path)
  768.           (let ((file (substitute-in-file-name
  769.                (expand-file-name filename path))))
  770.         (if (file-exists-p file) (throw 'answer file)))))
  771.     (setq searchpath (cdr searchpath)))
  772.       nil)))
  773.  
  774. (defun EGG:open-wnn ()
  775.   (let ((host (open-wnn-if-disconnected)))
  776.     (notify (egg:msg-get 'open-wnn)
  777.         (or host "local"))
  778.     (let* ((path (append egg-startup-file-search-path load-path))
  779.        (eggrc (or (egg:search-file egg-startup-file path)
  780.               (egg:search-file egg-default-startup-file load-path))))
  781.       (if (or (null skip-wnn-setenv-if-env-exist)
  782.           (null (wnn-server-dict-list)))
  783.       (if eggrc (load-file eggrc)
  784.         (let ((wnnenv-sticky nil)) (wnn-server-close))
  785.         (egg:error (egg:msg-get 'no-rcfile) path)))
  786.       (run-hooks 'egg:open-wnn-hook))))
  787.  
  788. (defun disconnect-wnn ()
  789. "Dump connection to Wnn servers, discarding dictionary and frequency changes."
  790.   (interactive)
  791.   (if (wnn-server-isconnect) (wnn-server-close)))
  792.  
  793. (defun close-wnn ()
  794. "Cleanly shutdown connection to Wnn servers, saving data and calling egg:close-wnn-hook"
  795.   (interactive)
  796.   (if (wnn-server-isconnect)
  797.       (progn
  798.     (wnn-server-set-rev nil)
  799.     (if (wnn-server-dict-save)
  800.         (message (egg:msg-get 'file-saved))
  801.       (message (wnn-server-get-msg)))
  802.     (sit-for 0)
  803.     (wnn-server-set-rev t)
  804.     (if (wnn-server-dict-save)
  805.         (message (egg:msg-get 'file-saved))
  806.       (message (wnn-server-get-msg)))
  807.     (sit-for 0)
  808.     (wnn-server-close)
  809.     (run-hooks 'egg:close-wnn-hook))))
  810.  
  811. (defun set-wnn-reverse (arg)
  812. ;  (open-wnn-if-disconnected)
  813.   (wnn-server-set-rev arg))
  814.  
  815. ;;;
  816. ;;; Kanji henkan
  817. ;;;
  818.  
  819. (defvar egg:*kanji-kanabuff* nil)
  820. (defvar egg:*dai* t)
  821. (defvar *bunsetu-number* nil)
  822. (defvar *zenkouho-suu* nil)
  823. (defvar *zenkouho-offset* nil)
  824.  
  825. (defun bunsetu-length-sho (number)
  826.   (cdr (wnn-server-bunsetu-yomi number)))
  827.   
  828. (defun bunsetu-length (number)
  829.   (let ((max (wnn-server-dai-end number))
  830.     (i (1+ number))
  831.     (l (bunsetu-length-sho number)))
  832.     (while (< i max)
  833.       (setq l (+ l (bunsetu-length-sho i)))
  834.       (setq i (1+ i)))
  835.     l))
  836.  
  837. (defun bunsetu-position (number)
  838.   (let ((pos egg:*region-start*) (i 0))
  839.     (while (< i number)
  840.       (setq pos (+ pos (length (bunsetu-kanji  i))
  841.            (if (wnn-server-dai-top (1+ i))
  842.                (length egg:*dai-bunsetu-kugiri*)
  843.              (length egg:*sho-bunsetu-kugiri*))))
  844.       (setq i (1+ i)))
  845.     pos))
  846.   
  847. (defun bunsetu-kanji (number) (car (wnn-server-bunsetu-kanji number)))
  848.   
  849. (defun bunsetu-yomi  (number) (car (wnn-server-bunsetu-yomi number)))
  850.  
  851. (defun bunsetu-kouho-suu (bunsetu-number init)
  852.   (if (or init (/= (wnn-server-zenkouho-bun) bunsetu-number))
  853.       (setq *zenkouho-offset* (wnn-server-zenkouho bunsetu-number egg:*dai*)))
  854.   (setq *zenkouho-suu* (wnn-server-zenkouho-suu)))
  855.  
  856. (defun bunsetu-kouho-list (bunsetu-number init)
  857.   (if (or init (/= (wnn-server-zenkouho-bun) bunsetu-number))
  858.       (setq *zenkouho-offset* (wnn-server-zenkouho bunsetu-number egg:*dai*)))
  859.   (let ((i (1- (setq *zenkouho-suu* (wnn-server-zenkouho-suu))))
  860.     (val nil))
  861.     (while (<= 0 i)
  862.       (setq val (cons (wnn-server-get-zenkouho i) val))
  863.       (setq i (1- i)))
  864.     val))
  865.  
  866. (defun bunsetu-kouho-number (bunsetu-number init)
  867.   (if (or init (/= (wnn-server-zenkouho-bun) bunsetu-number))
  868.       (setq *zenkouho-offset* (wnn-server-zenkouho bunsetu-number egg:*dai*)))
  869.   *zenkouho-offset*)
  870.  
  871. ;;;;
  872. ;;;; User entry : henkan-region, henkan-paragraph, henkan-sentence
  873. ;;;;
  874.  
  875. (defun egg:henkan-face-on ()
  876.   ;; Make an extent if henkan extent does not exist.
  877.   ;; Move henkan extent to henkan region.
  878.   (if egg:*henkan-face*
  879.       (progn
  880.     (if (extentp egg:*henkan-extent*)
  881.         (set-extent-endpoints egg:*henkan-extent* egg:*region-start* egg:*region-end*)
  882.       (setq egg:*henkan-extent* (make-extent egg:*region-start* egg:*region-end*))
  883.        (set-extent-property egg:*henkan-extent* 'start-open nil)
  884.        (set-extent-property egg:*henkan-extent* 'end-open nil)
  885.        (set-extent-property egg:*henkan-extent* 'detachable nil))
  886.     (set-extent-face egg:*henkan-extent* egg:*henkan-face*))))
  887.  
  888. (defun egg:henkan-face-off ()
  889.   ;; detach henkan extent from the current buffer.
  890.   (and egg:*henkan-face*
  891.        (extentp egg:*henkan-extent*)
  892.        (detach-extent egg:*henkan-extent*) ))
  893.  
  894.  
  895. (defun henkan-region (start end)
  896.   "Convert a text in the region between START and END from kana to kanji."
  897.   (interactive "r")
  898.   (if (interactive-p) (set-mark (point))) ;;; to be fixed
  899.   (henkan-region-internal start end))
  900.  
  901. (defun gyaku-henkan-region (start end)
  902.   "Convert a text in the region between START and END from kanji to kana."
  903.   (interactive "r")
  904.   (if (interactive-p) (set-mark (point))) ;;; to be fixed
  905.   (henkan-region-internal start end t))
  906.  
  907. ;(defvar henkan-mode-indicator "$B4A(B")
  908.  
  909. (defun henkan-region-internal (start end &optional rev)
  910.   ;; region $B$r$+$J4A;zJQ49$9$k(B
  911.   (if egg:henkan-mode-in-use nil
  912.     (let ((finished nil))
  913.       (unwind-protect
  914.       (progn
  915.         (setq egg:henkan-mode-in-use t)
  916.         (if (null (wnn-server-isconnect)) (EGG:open-wnn))
  917.         (setq egg:*kanji-kanabuff* (buffer-substring start end))
  918.         ;;; for Wnn6
  919.             (if (and (is-wnn6-server)
  920.              (not (and 
  921.                egg:*henkan-fence-mode*
  922.                *in-cont-flag*)))
  923.         (progn
  924.           (wnn6-reset-prev-info)))
  925.  
  926.         (setq *bunsetu-number* 0)
  927.         (setq egg:*dai* t)        ; 92.9.8 by T.shingu
  928.         (wnn-server-set-rev rev)
  929.         (let ((result (wnn-server-henkan-begin egg:*kanji-kanabuff*)))
  930.           (if (null result)
  931.           (egg:error (wnn-server-get-msg))
  932.         (if  (> result 0)
  933.             (progn
  934.               (mode-line-egg-mode-update (egg:msg-get 'henkan-mode-indicator))
  935.               (goto-char start)
  936.               (or (markerp egg:*region-start*)
  937.               (setq egg:*region-start* (make-marker)))
  938.               (or (markerp egg:*region-end*)
  939.               (setq egg:*region-end* (set-marker-insertion-type (make-marker) t)))
  940.               (if (null (marker-position egg:*region-start*))
  941.               (progn
  942.                 ;;;(setq egg:*global-map-backup* (current-global-map))
  943.                 (setq egg:*local-map-backup* (current-local-map))
  944.                 (and (boundp 'disable-undo) (setq disable-undo t))
  945.                 (delete-region start end)
  946.                 (goto-char start)
  947.                 (insert egg:*henkan-open*)
  948.                 (set-marker egg:*region-start* (point))
  949.                 (insert egg:*henkan-close*)
  950.                 (set-marker egg:*region-end* egg:*region-start*)
  951.                 (goto-char egg:*region-start*)
  952.                 )
  953.             (progn
  954.               (egg:fence-face-off)
  955.               (delete-region (- egg:*region-start* (length egg:*fence-open*)) 
  956.                      egg:*region-start*)
  957.               (delete-region egg:*region-end*
  958.                      (+ egg:*region-end* (length egg:*fence-close*)))
  959.               (goto-char egg:*region-start*)
  960.               (insert egg:*henkan-open*)
  961.               (set-marker egg:*region-start* (point))
  962.               (goto-char egg:*region-end*)
  963.               (let ((point (point)))
  964.                 (insert egg:*henkan-close*)
  965.                 (set-marker egg:*region-end* point))
  966.               (goto-char start)
  967.               (delete-region start end)
  968.               ))
  969.               (henkan-insert-kouho 0 result)
  970.               (egg:henkan-face-on)
  971.               (egg:bunsetu-face-on)
  972.               (henkan-goto-bunsetu 0)
  973.               ;;;(use-global-map henkan-mode-map)
  974.               ;;;(use-local-map nil)
  975.               (use-local-map henkan-mode-map)
  976.               (run-hooks 'egg:henkan-start-hook)))))
  977.         (setq finished t))
  978.     (or finished (setq disable-undo nil) (setq egg:henkan-mode-in-use nil)))))
  979.   )
  980.  
  981. (defun henkan-paragraph ()
  982.   "Convert the current paragraph from kana to kanji."
  983.   (interactive)
  984.   (forward-paragraph)
  985.   (let ((end (point)))
  986.     (backward-paragraph)
  987.     (henkan-region-internal (point) end)))
  988.  
  989. (defun gyaku-henkan-paragraph ()
  990.   "Convert the current paragraph from kanji to kana."
  991.   (interactive)
  992.   (forward-paragraph)
  993.   (let ((end (point)))
  994.     (backward-paragraph)
  995.     (henkan-region-internal (point) end t)))
  996.  
  997. (defun henkan-sentence ()
  998.   "Convert the current sentence from kana to kanji."
  999.   (interactive)
  1000.   (forward-sentence)
  1001.   (let ((end (point)))
  1002.     (backward-sentence)
  1003.     (henkan-region-internal (point) end)))
  1004.  
  1005. (defun gyaku-henkan-sentence ()
  1006.   "Convert the current sentence from kanji to kana."
  1007.   (interactive)
  1008.   (forward-sentence)
  1009.   (let ((end (point)))
  1010.     (backward-sentence)
  1011.     (henkan-region-internal (point) end t)))
  1012.  
  1013. (defun henkan-word ()
  1014.   "Convert the current word from kana to kanji."
  1015.   (interactive)
  1016.   (re-search-backward "\\<" nil t)
  1017.   (let ((start (point)))
  1018.     (re-search-forward "\\>" nil t)
  1019.     (henkan-region-internal start (point))))
  1020.  
  1021. (defun gyaku-henkan-word ()
  1022.   "Convert the current word from kanji to kana."
  1023.   (interactive)
  1024.   (re-search-backward "\\<" nil t)
  1025.   (let ((start (point)))
  1026.     (re-search-forward "\\>" nil t)
  1027.     (henkan-region-internal start (point) t)))
  1028.  
  1029. ;;;
  1030. ;;; Kana Kanji Henkan Henshuu mode
  1031. ;;;
  1032.  
  1033. (defun set-egg-henkan-mode-format (open close kugiri-dai kugiri-sho
  1034.                     &optional henkan-face dai-bunsetu-face sho-bunsetu-face)
  1035.    "$BJQ49(B mode $B$NI=<(J}K!$r@_Dj$9$k!#(BOPEN $B$OJQ49$N;OE@$r<($9J8;zNs$^$?$O(B nil$B!#(B
  1036. CLOSE$B$OJQ49$N=*E@$r<($9J8;zNs$^$?$O(B nil$B!#(B
  1037. KUGIRI-DAI$B$OBgJ8@a$N6h@Z$j$rI=<($9$kJ8;zNs$^$?$O(B nil$B!#(B
  1038. KUGIRI-SHO$B$O>.J8@a$N6h@Z$j$rI=<($9$kJ8;zNs$^$?$O(B nil$B!#(B
  1039. optional HENKAN-FACE $B$OJQ496h4V$rI=<($9$k(B face $B$^$?$O(B nil
  1040. optional DAI-BUNSETU-FACE $B$OBgJ8@a6h4V$rI=<($9$k(B face $B$^$?$O(B nil
  1041. optional SHO-BUNSETU-FACE $B$O>.J8@a6h4V$rI=<($9$k(B face $B$^$?$O(B nil"
  1042.  
  1043.   (interactive (list (read-string (egg:msg-get 'begin-henkan))
  1044.              (read-string (egg:msg-get 'end-henkan))
  1045.              (read-string (egg:msg-get 'kugiri-dai))
  1046.              (read-string (egg:msg-get 'kugiri-sho))
  1047.              (cdr (assoc (completing-read (egg:msg-get 'face-henkan)
  1048.                           egg:*face-alist*)
  1049.                  egg:*face-alist*))
  1050.              (cdr (assoc (completing-read (egg:msg-get 'face-dai)
  1051.                           egg:*face-alist*)
  1052.                  egg:*face-alist*))
  1053.              (cdr (assoc (completing-read (egg:msg-get 'face-sho)
  1054.                           egg:*face-alist*)
  1055.                  egg:*face-alist*))
  1056.              ))
  1057.   (if (or (stringp open)  (null open))
  1058.       (setq egg:*henkan-open* open)
  1059.     (egg:error "Wrong type of arguments(open): %s" open))
  1060.  
  1061.   (if (or (stringp close) (null close))
  1062.       (setq egg:*henkan-close* close)
  1063.     (egg:error "Wrong type of arguments(close): %s" close))
  1064.  
  1065.   (if (or (stringp kugiri-dai) (null kugiri-dai))
  1066.       (setq egg:*dai-bunsetu-kugiri* (or kugiri-dai ""))
  1067.     (egg:error "Wrong type of arguments(kugiri-dai): %s" kugiri-dai))
  1068.  
  1069.   (if (or (stringp kugiri-sho) (null kugiri-sho))
  1070.       (setq egg:*sho-bunsetu-kugiri* (or kugiri-sho ""))
  1071.     (egg:error "Wrong type of arguments(kugiri-sho): %s" kugiri-sho))
  1072.  
  1073.   (if (or (null henkan-face) (memq henkan-face (face-list)))
  1074.       (progn
  1075.     (setq egg:*henkan-face* henkan-face)
  1076.     (if (extentp egg:*henkan-extent*)
  1077.         (set-extent-property egg:*henkan-extent* 'face egg:*henkan-face*)))
  1078.     (egg:error "Wrong type of arguments(henkan-face): %s" henkan-face))
  1079.  
  1080.   (if (or (null dai-bunsetu-face) (memq dai-bunsetu-face (face-list)))
  1081.       (progn
  1082.     (setq egg:*dai-bunsetu-face* dai-bunsetu-face)
  1083.     (if (extentp egg:*dai-bunsetu-extent*)
  1084.         (set-extent-property egg:*dai-bunsetu-extent* 'face egg:*dai-bunsetu-face*)))
  1085.     (egg:error "Wrong type of arguments(dai-bunsetu-face): %s" dai-bunsetu-face))
  1086.  
  1087.   (if (or (null sho-bunsetu-face) (memq sho-bunsetu-face (face-list)))
  1088.       (progn
  1089.     (setq egg:*sho-bunsetu-face* sho-bunsetu-face)
  1090.     (if (extentp egg:*sho-bunsetu-extent*)
  1091.         (set-extent-property egg:*sho-bunsetu-extent* 'face egg:*sho-bunsetu-face*)))
  1092.     (egg:error "Wrong type of arguments(sho-bunsetu-face): %s" sho-bunsetu-face))
  1093.   )
  1094.  
  1095. (defun henkan-insert-kouho (start number)
  1096.   (let ((i start))
  1097.     (while (< i number)
  1098.       (insert (car (wnn-server-bunsetu-kanji i))
  1099.           (if (= (1+ i) number)
  1100.           ""
  1101.         (if (wnn-server-dai-top (1+ i))
  1102.             egg:*dai-bunsetu-kugiri*
  1103.           egg:*sho-bunsetu-kugiri*)))
  1104.       (setq i (1+ i)))))
  1105.  
  1106. (defun henkan-kakutei ()
  1107.   "Accept the current henkan region"
  1108.   (interactive)
  1109.   (egg:bunsetu-face-off)
  1110.   (egg:henkan-face-off)
  1111.   (delete-region (- egg:*region-start* (length egg:*henkan-open*))
  1112.          egg:*region-start*)
  1113.   (delete-region egg:*region-start* egg:*region-end*)
  1114.   (delete-region egg:*region-end* (+ egg:*region-end* (length egg:*henkan-close*)))
  1115.   (goto-char egg:*region-start*)
  1116.   (setq egg:*sai-henkan-start* (point))
  1117.   (let ((i 0) (max (wnn-server-bunsetu-suu)))
  1118.     (setq egg:*old-bunsetu-suu* max)
  1119.     (while (< i max)
  1120.       (insert (car (wnn-server-bunsetu-kanji i )))
  1121.       (if (not overwrite-mode)
  1122.       (undo-boundary))
  1123.       (setq i (1+ i))
  1124.       ))
  1125.   (setq egg:*sai-henkan-end* (point))
  1126.   (wnn-server-hindo-update)
  1127.   (setq egg:henkan-mode-in-use nil)
  1128.   (egg:quit-egg-mode)
  1129.   (run-hooks 'egg:henkan-end-hook)
  1130.   )
  1131.  
  1132. ;; 92.7.10 by K.Handa
  1133. (defun henkan-kakutei-first-char ()
  1134.   "$B3NDjJ8;zNs$N:G=i$N0lJ8;z$@$1A^F~$9$k!#(B"
  1135.   (interactive)
  1136.   (egg:bunsetu-face-off)
  1137.   (egg:henkan-face-off)
  1138.   (delete-region (- egg:*region-start* (length egg:*henkan-open*))
  1139.          egg:*region-start*)
  1140.   (delete-region egg:*region-start* egg:*region-end*)
  1141.   (delete-region egg:*region-end* (+ egg:*region-end*
  1142.                      ;; 92.8.5  by Y.Kasai
  1143.                      (length egg:*henkan-close*)))
  1144.   (goto-char egg:*region-start*)
  1145.   (insert (car (wnn-server-bunsetu-kanji 0)))
  1146.   (if (not overwrite-mode)
  1147.       (undo-boundary))
  1148.   (goto-char egg:*region-start*)
  1149.   (forward-char 1)
  1150.   (delete-region (point) egg:*region-end*)
  1151.   (wnn-server-hindo-update)
  1152.   (setq egg:henkan-mode-in-use nil)
  1153.   (egg:quit-egg-mode)
  1154.   )
  1155. ;; end of patch
  1156.  
  1157. (defun henkan-kakutei-before-point ()
  1158. "Accept the henkan region before point, and put the rest back into a fence."
  1159.   (interactive)
  1160.   (egg:bunsetu-face-off)
  1161.   (egg:henkan-face-off)
  1162.   (delete-region egg:*region-start* egg:*region-end*)
  1163.   (goto-char egg:*region-start*)
  1164.   (let ((i 0) (max *bunsetu-number*))
  1165.     (while (< i max)
  1166.       (insert (car (wnn-server-bunsetu-kanji i )))
  1167.       (if (not overwrite-mode)
  1168.       (undo-boundary))
  1169.       (setq i (1+ i))
  1170.       ))
  1171.   (wnn-server-hindo-update *bunsetu-number*)
  1172.   (delete-region (- egg:*region-start* (length egg:*henkan-open*))
  1173.          egg:*region-start*)
  1174.   (insert egg:*fence-open*)
  1175.   (set-marker egg:*region-start* (point))
  1176.   (delete-region egg:*region-end* (+ egg:*region-end* (length egg:*henkan-close*)))
  1177.   (goto-char egg:*region-end*)
  1178.   (let ((point (point)))
  1179.     (insert egg:*fence-close*)
  1180.     (set-marker egg:*region-end* point))
  1181.   (goto-char egg:*region-start*)
  1182.   (egg:fence-face-on)
  1183.   (let ((point (point))
  1184.     (i *bunsetu-number*) (max (wnn-server-bunsetu-suu)))
  1185.     (while (< i max)
  1186.       (insert (car (wnn-server-bunsetu-yomi i)))
  1187.       (setq i (1+ i)))
  1188.     ;;;(insert "|")
  1189.     ;;;(insert egg:*fence-close*)
  1190.     ;;;(set-marker egg:*region-end* (point))
  1191.     (goto-char point))
  1192.   (setq egg:*mode-on* t)
  1193.   ;;;(use-global-map fence-mode-map)
  1194.   ;;;(use-local-map  nil)
  1195.   (setq egg:henkan-mode-in-use nil)
  1196.   (use-local-map fence-mode-map)
  1197.   (egg:mode-line-display))
  1198.  
  1199. ;; ### Should probably put this on a key.
  1200. (defun sai-henkan ()
  1201. "Reconvert last henkan entry."
  1202.   (interactive)
  1203.   (if egg:henkan-mode-in-use nil
  1204.     (let ((finished nil))
  1205.       (unwind-protect
  1206.        (progn
  1207.      (setq egg:henkan-mode-in-use t)
  1208.      (mode-line-egg-mode-update (egg:msg-get 'henkan-mode-indicator))
  1209.      (goto-char egg:*sai-henkan-start*)
  1210.      (setq egg:*local-map-backup* (current-local-map))
  1211.      (and (boundp 'disable-undo) (setq disable-undo t))
  1212.      (delete-region egg:*sai-henkan-start* egg:*sai-henkan-end*)
  1213.      (goto-char egg:*sai-henkan-start*)
  1214.      (insert egg:*henkan-open*)
  1215.      (set-marker egg:*region-start* (point))
  1216.      (insert egg:*henkan-close*)
  1217.      (set-marker egg:*region-end* egg:*region-start*)
  1218.      (goto-char egg:*region-start*)
  1219.      (henkan-insert-kouho 0 egg:*old-bunsetu-suu*)
  1220.      (egg:henkan-face-on)
  1221.      (egg:bunsetu-face-on)
  1222.      (henkan-goto-bunsetu 0)
  1223.      (use-local-map henkan-mode-map)
  1224.      (setq finished t))
  1225.        (or finished (setq disable-undo nil) (setq egg:henkan-mode-in-use nil)))))
  1226.   )
  1227.  
  1228. (defun egg:bunsetu-face-on ()
  1229.   ;; make dai-bunsetu extent and sho-bunsetu extent if they do not exist.
  1230.   ;; put thier faces to extents and move them to each bunsetu.
  1231.   (let* ((bunsetu-begin *bunsetu-number*)
  1232.      (bunsetu-end))
  1233. ;     (bunsetu-suu (wnn-server-bunsetu-suu)))
  1234. ; dai bunsetu
  1235.     (if egg:*dai-bunsetu-face*
  1236.     (progn
  1237.       (if (extentp egg:*dai-bunsetu-extent*)
  1238.           nil
  1239.         (setq egg:*dai-bunsetu-extent* (make-extent 1 1))
  1240.         (set-extent-property egg:*dai-bunsetu-extent* 'face egg:*dai-bunsetu-face*))
  1241.       (setq bunsetu-end (wnn-server-dai-end *bunsetu-number*))
  1242.       (while (not (wnn-server-dai-top bunsetu-begin))
  1243.         (setq bunsetu-begin (1- bunsetu-begin)))
  1244.       (set-extent-endpoints egg:*dai-bunsetu-extent*
  1245.             (bunsetu-position bunsetu-begin)
  1246.             (+ (bunsetu-position (1- bunsetu-end))
  1247.                (length (bunsetu-kanji (1- bunsetu-end)))))))
  1248. ; sho bunsetu
  1249.     (if egg:*sho-bunsetu-face*
  1250.     (progn
  1251.       (if (extentp egg:*sho-bunsetu-extent*)
  1252.            nil
  1253.         (setq egg:*sho-bunsetu-extent* (make-extent 1 1))
  1254.         (set-extent-property egg:*sho-bunsetu-extent* 'face egg:*sho-bunsetu-face*))
  1255.       (setq bunsetu-end (1+ *bunsetu-number*))
  1256.       (set-extent-endpoints egg:*sho-bunsetu-extent*
  1257.             (let ((point (bunsetu-position *bunsetu-number*)))
  1258. ;; ###jhod Removed the char-boundary stuff, as I *THINK* we can only move by whole chars...
  1259. ;;              (if (eq egg:*sho-bunsetu-face* 'modeline)
  1260. ;;                  (+ point (1+ (char-boundary-p point)))
  1261. ;;                point))
  1262.               (if (eq egg:*sho-bunsetu-face* 'modeline)
  1263.                   (+ point 1)
  1264.                 point))
  1265.  
  1266.             (+ (bunsetu-position (1- bunsetu-end))
  1267.                (length (bunsetu-kanji (1- bunsetu-end)))))))))
  1268.  
  1269. (defun egg:bunsetu-face-off ()
  1270.   (and egg:*dai-bunsetu-face*
  1271.        (extentp egg:*dai-bunsetu-extent*)
  1272.        (delete-extent egg:*dai-bunsetu-extent*))
  1273.   (and egg:*sho-bunsetu-face*
  1274.        (extentp egg:*sho-bunsetu-extent*)
  1275.        (delete-extent egg:*sho-bunsetu-extent*))
  1276.   )
  1277.  
  1278. (defun henkan-goto-bunsetu (number)
  1279.   (setq *bunsetu-number*
  1280.     (check-number-range number 0 (1- (wnn-server-bunsetu-suu))))
  1281.   (goto-char (bunsetu-position *bunsetu-number*))
  1282. ;  (egg:move-bunsetu-extent)
  1283.   (egg:bunsetu-face-on)
  1284.   )
  1285.  
  1286. (defun henkan-forward-bunsetu ()
  1287.   (interactive)
  1288.   (henkan-goto-bunsetu (1+ *bunsetu-number*))
  1289.   )
  1290.  
  1291. (defun henkan-backward-bunsetu ()
  1292.   (interactive)
  1293.   (henkan-goto-bunsetu (1- *bunsetu-number*))
  1294.   )
  1295.  
  1296. (defun henkan-first-bunsetu ()
  1297.   (interactive)
  1298.   (henkan-goto-bunsetu 0))
  1299.  
  1300. (defun henkan-last-bunsetu ()
  1301.   (interactive)
  1302.   (henkan-goto-bunsetu (1- (wnn-server-bunsetu-suu)))
  1303.   )
  1304.  
  1305. (defun check-number-range (i min max)
  1306.   (cond((< i min) max)
  1307.        ((< max i) min)
  1308.        (t i)))
  1309.  
  1310. (defun henkan-hiragana ()
  1311.   (interactive)
  1312.   (henkan-goto-kouho (- (bunsetu-kouho-suu *bunsetu-number* nil) 1)))
  1313.  
  1314. (defun henkan-katakana ()
  1315.   (interactive)
  1316.   (henkan-goto-kouho (- (bunsetu-kouho-suu *bunsetu-number* nil) 2)))
  1317.  
  1318. (defun henkan-next-kouho ()
  1319.   (interactive)
  1320.   (henkan-goto-kouho (1+ (bunsetu-kouho-number *bunsetu-number* nil))))
  1321.  
  1322. (defun henkan-next-kouho-dai ()
  1323.   (interactive)
  1324.   (let ((init (not egg:*dai*)))
  1325.     (setq egg:*dai* t)
  1326.     (henkan-goto-kouho (1+ (bunsetu-kouho-number *bunsetu-number* init)))))
  1327.  
  1328. (defun henkan-next-kouho-sho ()
  1329.   (interactive)
  1330.   (let ((init egg:*dai*))
  1331.     (setq egg:*dai* nil)
  1332.     (henkan-goto-kouho (1+ (bunsetu-kouho-number *bunsetu-number* init)))))
  1333.   
  1334. (defun henkan-previous-kouho ()
  1335.   (interactive)
  1336.   (henkan-goto-kouho (1- (bunsetu-kouho-number *bunsetu-number* nil))))
  1337.  
  1338. (defun henkan-previous-kouho-dai ()
  1339.   (interactive)
  1340.   (let ((init (not egg:*dai*)))
  1341.     (setq egg:*dai* t)
  1342.     (henkan-goto-kouho (1- (bunsetu-kouho-number *bunsetu-number* init)))))
  1343.  
  1344. (defun henkan-previous-kouho-sho ()
  1345.   (interactive)
  1346.   (let ((init egg:*dai*))
  1347.     (setq egg:*dai* nil)
  1348.     (henkan-goto-kouho (1- (bunsetu-kouho-number *bunsetu-number* init)))))
  1349.  
  1350. (defun henkan-goto-kouho (kouho-number)
  1351. ;  (egg:bunsetu-face-off)
  1352.   (let ((point (point))
  1353. ;    (yomi  (bunsetu-yomi *bunsetu-number*))
  1354.     (max)
  1355.     (min))
  1356.     (setq kouho-number 
  1357.       (check-number-range kouho-number 
  1358.                   0
  1359.                   (1- (length (bunsetu-kouho-list
  1360.                        *bunsetu-number* nil)))))
  1361.     (setq *zenkouho-offset* kouho-number)
  1362.     (wnn-server-henkan-kakutei kouho-number egg:*dai*)
  1363.     (setq max (wnn-server-bunsetu-suu))
  1364.     (setq min (max 0 (1- *bunsetu-number*)))
  1365.     (delete-region 
  1366.      (bunsetu-position min) egg:*region-end*)
  1367.     (goto-char (bunsetu-position min))
  1368.     (henkan-insert-kouho min max)
  1369.     (goto-char point))
  1370. ;  (egg:move-bunsetu-extent)
  1371.   (egg:bunsetu-face-on)
  1372.   (egg:henkan-face-on)
  1373.   )
  1374.   
  1375. (defun henkan-bunsetu-chijime-dai ()
  1376.   (interactive)
  1377.   (setq egg:*dai* t)
  1378.   (or (= (bunsetu-length *bunsetu-number*) 1)
  1379.       (bunsetu-length-henko (1-  (bunsetu-length *bunsetu-number*)))))
  1380.  
  1381. (defun henkan-bunsetu-chijime-sho ()
  1382.   (interactive)
  1383.   (setq egg:*dai* nil)
  1384.   (or (= (bunsetu-length-sho *bunsetu-number*) 1)
  1385.       (bunsetu-length-henko (1-  (bunsetu-length-sho *bunsetu-number*)))))
  1386.  
  1387. (defun henkan-bunsetu-nobasi-dai ()
  1388.   (interactive)
  1389.   (setq egg:*dai* t)
  1390.   (let ((i *bunsetu-number*)
  1391.     (max (wnn-server-bunsetu-suu))
  1392.     (len (bunsetu-length *bunsetu-number*))
  1393.     (maxlen 0))
  1394.     (while (< i max)
  1395.       (setq maxlen (+ maxlen (cdr (wnn-server-bunsetu-yomi i))))
  1396.       (setq i (1+ i)))
  1397.     (if (not (= len maxlen))
  1398.     (bunsetu-length-henko (1+ len)))))
  1399.  
  1400. (defun henkan-bunsetu-nobasi-sho ()
  1401.   (interactive)
  1402.   (setq egg:*dai* nil)
  1403.   (let ((i *bunsetu-number*)
  1404.     (max (wnn-server-bunsetu-suu))
  1405.     (len (bunsetu-length-sho *bunsetu-number*))
  1406.     (maxlen 0))
  1407.     (while (< i max)
  1408.       (setq maxlen (+ maxlen (cdr (wnn-server-bunsetu-yomi i))))
  1409.       (setq i (1+ i)))
  1410.     (if (not (= len maxlen))
  1411.     (bunsetu-length-henko (1+ len)))))
  1412.  
  1413. ;  (if (not (= (1+ *bunsetu-number*) (wnn-server-bunsetu-suu)))
  1414. ;      (bunsetu-length-henko (1+ (bunsetu-length *bunsetu-number*)))))
  1415.  
  1416.  
  1417. (defun henkan-saishou-bunsetu ()
  1418.   (interactive)
  1419.   (bunsetu-length-henko 1))
  1420.  
  1421. (defun henkan-saichou-bunsetu ()
  1422.   (interactive)
  1423.   (let ((max (wnn-server-bunsetu-suu)) (i *bunsetu-number*)
  1424.     (l 0))
  1425.     (while (< i max)
  1426.       (setq l (+ l (bunsetu-length-sho i)))
  1427.       (setq i (1+ i)))
  1428.     (bunsetu-length-henko l)))
  1429.  
  1430. (defun bunsetu-length-henko (length)
  1431.   (let ((r (wnn-server-bunsetu-henkou *bunsetu-number* length egg:*dai*))
  1432.     (start (max 0 (1- *bunsetu-number*))))
  1433.     (cond((null r)
  1434.       (egg:error (wnn-server-get-msg)))
  1435.      ((> r 0)
  1436. ;      (egg:henkan-face-off)
  1437. ;      (egg:bunsetu-face-off)
  1438.       (delete-region 
  1439.        (bunsetu-position start) egg:*region-end*)
  1440.       (goto-char (bunsetu-position start))
  1441.       (henkan-insert-kouho start r)
  1442.       (henkan-goto-bunsetu *bunsetu-number*)))))
  1443.  
  1444. (defun henkan-quit ()
  1445.   (interactive)
  1446.   (egg:bunsetu-face-off)
  1447.   (egg:henkan-face-off)
  1448.   (delete-region (- egg:*region-start* (length egg:*henkan-open*))
  1449.          egg:*region-start*)
  1450.   (delete-region egg:*region-start* egg:*region-end*)
  1451.   (delete-region egg:*region-end* (+ egg:*region-end* (length egg:*henkan-close*)))
  1452.   (goto-char egg:*region-start*)
  1453.   (insert egg:*fence-open*)
  1454.   (set-marker egg:*region-start* (point))
  1455.   (insert egg:*kanji-kanabuff*)
  1456.   (let ((point (point)))
  1457.     (insert egg:*fence-close*)
  1458.     (set-marker egg:*region-end* point)
  1459.     )
  1460.   (goto-char egg:*region-end*)
  1461.   (egg:fence-face-on)
  1462.   (wnn-server-henkan-quit)
  1463.   (setq egg:*mode-on* t)
  1464.   ;;;(use-global-map fence-mode-map)
  1465.   ;;;(use-local-map  nil)
  1466.   (setq egg:henkan-mode-in-use nil)
  1467.   (use-local-map fence-mode-map)
  1468.   (egg:mode-line-display)
  1469.   )
  1470.  
  1471. (defun henkan-select-kouho (init)
  1472.   (if (not (eq (selected-window) (minibuffer-window)))
  1473.       (let ((kouho-list (bunsetu-kouho-list *bunsetu-number* init))
  1474.         menu)
  1475.     (setq menu
  1476.           (list 'menu (egg:msg-get 'jikouho)
  1477.             (let ((l kouho-list) (r nil) (i 0))
  1478.               (while l
  1479.             (setq r (cons (cons (car l) i) r))
  1480.             (setq i (1+ i))
  1481.             (setq l (cdr l)))
  1482.               (reverse r))))
  1483.     (henkan-goto-kouho 
  1484.      (menu:select-from-menu menu 
  1485.                 (bunsetu-kouho-number *bunsetu-number* nil))))
  1486.     (beep)))
  1487.  
  1488. (defun henkan-select-kouho-dai ()
  1489.   (interactive)
  1490.   (let ((init (not egg:*dai*)))
  1491.     (setq egg:*dai* t)
  1492.     (henkan-select-kouho init)))
  1493.  
  1494. (defun henkan-select-kouho-sho ()
  1495.   (interactive)
  1496.   (let ((init egg:*dai*))
  1497.     (setq egg:*dai* nil)
  1498.     (henkan-select-kouho init)))
  1499.  
  1500. (defun henkan-word-off ()
  1501.   (interactive)
  1502.   (let ((info (wnn-server-inspect *bunsetu-number*)))
  1503.     (if (null info)
  1504.     (notify (wnn-server-get-msg))
  1505.       (progn
  1506.     (let ((dic-list (wnn-server-dict-list)))
  1507.       (if (null dic-list)
  1508.           (notify (wnn-server-get-msg))
  1509.         (progn
  1510.           (let* ((kanji (nth 0 info))
  1511.              (yomi (nth 1 info))
  1512.              (serial   (nth 3 info))
  1513.              (jisho-no (nth 2 info))
  1514.              (jisho-name (nth 2 (assoc jisho-no dic-list))))
  1515.         (if (wnn-server-word-use jisho-no serial)
  1516.             (notify (egg:msg-get 'off-msg)
  1517.                 kanji yomi jisho-name serial)
  1518.           (egg:error (wnn-server-get-msg)))))))))))
  1519.  
  1520. (defun henkan-kakutei-and-self-insert ()
  1521.   (interactive)
  1522.   (setq unread-command-events (list last-command-event))
  1523.   (henkan-kakutei))
  1524.  
  1525. (defvar henkan-mode-map (make-keymap))
  1526. (defvar henkan-mode-esc-map (make-keymap))
  1527.  
  1528. (define-key henkan-mode-map [t] 'undefined)
  1529. (define-key henkan-mode-esc-map [t] 'undefined)
  1530.  
  1531. (let ((ch 0))
  1532.   (while (<= ch 127)
  1533.     (define-key henkan-mode-map (char-to-string ch) 'undefined)
  1534.     (define-key henkan-mode-esc-map (char-to-string ch) 'undefined)
  1535.     (setq ch (1+ ch))))
  1536.  
  1537. (let ((ch 32))
  1538.   (while (< ch 127)
  1539.     (define-key henkan-mode-map (char-to-string ch) 'henkan-kakutei-and-self-insert)
  1540.     (setq ch (1+ ch))))
  1541.  
  1542. (define-key henkan-mode-map "\e"   henkan-mode-esc-map)
  1543. (define-key henkan-mode-map [escape]   henkan-mode-esc-map)
  1544. ;(define-key henkan-mode-map "\ei"  'henkan-inspect-bunsetu)
  1545. (define-key henkan-mode-map "\ei"  'henkan-bunsetu-chijime-sho)
  1546. (define-key henkan-mode-map "\eo"  'henkan-bunsetu-nobasi-sho)
  1547. (define-key henkan-mode-map "\es"  'henkan-select-kouho-dai)
  1548. (define-key henkan-mode-map "\eh"  'henkan-hiragana)
  1549. (define-key henkan-mode-map "\ek"  'henkan-katakana)
  1550. (define-key henkan-mode-map "\ez"  'henkan-select-kouho-sho)
  1551. (define-key henkan-mode-map "\e<"  'henkan-saishou-bunsetu)
  1552. (define-key henkan-mode-map "\e>"  'henkan-saichou-bunsetu)
  1553. ;(define-key henkan-mode-map " "    'henkan-next-kouho-dai)
  1554.                     ; 92.9.8 by T.Shingu
  1555. (define-key henkan-mode-map " "    'henkan-next-kouho)
  1556.                     ; 92.7.10 by K.Handa
  1557. (define-key henkan-mode-map "\C-@" 'henkan-kakutei-first-char)
  1558. (define-key henkan-mode-map [?\C-\ ] 'henkan-kakutei-first-char)
  1559. (define-key henkan-mode-map "\C-a" 'henkan-first-bunsetu)
  1560. (define-key henkan-mode-map "\C-b" 'henkan-backward-bunsetu)
  1561. (define-key henkan-mode-map "\C-c" 'henkan-quit)
  1562. (define-key henkan-mode-map "\C-e" 'henkan-last-bunsetu)
  1563. (define-key henkan-mode-map "\C-f" 'henkan-forward-bunsetu)
  1564. (define-key henkan-mode-map "\C-g" 'henkan-quit)
  1565. (define-key henkan-mode-map "\C-i" 'henkan-bunsetu-chijime-dai)
  1566. (define-key henkan-mode-map "\C-k" 'henkan-kakutei-before-point)
  1567. (define-key henkan-mode-map "\C-l" 'henkan-kakutei)
  1568. (define-key henkan-mode-map "\C-m" 'henkan-kakutei)
  1569. (define-key henkan-mode-map [return] 'henkan-kakutei)
  1570. (define-key henkan-mode-map "\C-n" 'henkan-next-kouho)
  1571. (define-key henkan-mode-map "\C-o" 'henkan-bunsetu-nobasi-dai)
  1572. (define-key henkan-mode-map "\C-p" 'henkan-previous-kouho)
  1573. (define-key henkan-mode-map "\C-t"  'toroku-henkan-mode)
  1574. (define-key henkan-mode-map "\C-u" 'undefined)
  1575. (define-key henkan-mode-map "\C-v" 'henkan-inspect-bunsetu)
  1576. (define-key henkan-mode-map "\C-w" 'henkan-next-kouho-dai)
  1577. (define-key henkan-mode-map "\C-z" 'henkan-next-kouho-sho)
  1578. (define-key henkan-mode-map "\177" 'henkan-quit)
  1579. (define-key henkan-mode-map [delete] 'henkan-quit)
  1580. (define-key henkan-mode-map 'backspace 'henkan-quit)
  1581. (define-key henkan-mode-map '(control h) 'henkan-help-command)
  1582. (define-key henkan-mode-map [right] 'henkan-forward-bunsetu)
  1583. (define-key henkan-mode-map [left] 'henkan-backward-bunsetu)
  1584. (define-key henkan-mode-map [down] 'henkan-next-kouho)
  1585. (define-key henkan-mode-map [up] 'henkan-previous-kouho)
  1586.  
  1587. (defun henkan-help-command ()
  1588.   "Display documentation for henkan-mode."
  1589.   (interactive)
  1590.   (let ((buf "*Help*"))
  1591.     (if (eq (get-buffer buf) (current-buffer))
  1592.     (henkan-quit)
  1593.       (with-output-to-temp-buffer buf
  1594.     ;;(princ (substitute-command-keys henkan-mode-document-string))
  1595.     (princ (substitute-command-keys (egg:msg-get 'henkan-help)))
  1596.     (print-help-return-message)))))
  1597.  
  1598. ;;;----------------------------------------------------------------------
  1599. ;;;
  1600. ;;; Dictionary management Facility
  1601. ;;;
  1602. ;;;----------------------------------------------------------------------
  1603.  
  1604. ;;;
  1605. ;;; $B<-=qEPO?(B 
  1606. ;;;
  1607.  
  1608. ;;;;
  1609. ;;;; User entry: toroku-region
  1610. ;;;;
  1611.  
  1612. (defun remove-regexp-in-string (regexp string)
  1613.   (cond((not(string-match regexp string))
  1614.     string)
  1615.        (t(let ((str nil)
  1616.          (ostart 0)
  1617.          (oend   (match-beginning 0))
  1618.          (nstart (match-end 0)))
  1619.      (setq str (concat str (substring string ostart oend)))
  1620.      (while (string-match regexp string nstart)
  1621.        (setq ostart nstart)
  1622.        (setq oend   (match-beginning 0))
  1623.        (setq nstart (match-end 0))
  1624.        (setq str (concat str (substring string ostart oend))))
  1625.      (concat str (substring string nstart))))))
  1626.  
  1627. (defun hinsi-from-menu (dict-number name)
  1628.   (let ((result (wnn-server-hinsi-list dict-number name))
  1629. ;    (hinsi-pair)
  1630.     (menu))
  1631.     (if (null result)
  1632.     (egg:error (wnn-server-get-msg))
  1633.       (if (eq result 0)
  1634.       name
  1635.     (progn
  1636. ;      (setq hinsi-pair (mapcar '(lambda (x) (cons x x)) result))
  1637. ;      (if (null (string= name "/"))
  1638. ;          (setq hinsi-pair (cons (cons "/" "/") hinsi-pair)))
  1639. ;      (setq menu (list 'menu (egg:msg-get 'hinsimei) hinsi-pair))
  1640.       (setq menu (list 'menu (egg:msg-get 'hinsimei)
  1641.                (if (string= name "/")
  1642.                    result
  1643.                  (cons "/" result))))
  1644.       (hinsi-from-menu dict-number 
  1645.                (menu:select-from-menu menu)))))))
  1646.  
  1647. (defun wnn-dict-name (dict-number dict-list)
  1648.   (let* ((dict-info (assoc dict-number dict-list))
  1649.      (dict-comment (nth 2 dict-info)))
  1650.     (if (string= dict-comment "")
  1651.     (file-name-nondirectory (nth 1 dict-info))
  1652.       dict-comment)))
  1653.  
  1654. (defun egg:toroku-word (yomi kanji interactive)
  1655.   (let*((dic-list (wnn-server-dict-list))
  1656.     (writable-dic-list (wnn-server-hinsi-dicts -1))
  1657.     (dict-number
  1658.      (menu:select-from-menu
  1659.       (list 'menu (egg:msg-get 'touroku-jishomei)
  1660.         (mapcar '(lambda (x)
  1661.                (let ((y (car (assoc x dic-list))))
  1662.                  (cons (wnn-dict-name y dic-list) y)))
  1663.             writable-dic-list))))
  1664.     (hinsi-name (hinsi-from-menu dict-number "/"))
  1665.     (hinsi-no (wnn-server-hinsi-number hinsi-name))
  1666.     (dict-name (wnn-dict-name dict-number dic-list)))
  1667.     (if (or (not interactive)
  1668.         (notify-yes-or-no-p (egg:msg-get 'register-notify)
  1669.                 kanji yomi hinsi-name dict-name))
  1670.     (if (wnn-server-word-add dict-number kanji yomi "" hinsi-no)
  1671.         (notify (egg:msg-get 'registerd) kanji yomi hinsi-name dict-name)
  1672.       (egg:error (wnn-server-get-msg))))))
  1673.  
  1674. (defun toroku-region (start end)
  1675.   (interactive "r")
  1676.   (if (null (wnn-server-isconnect)) (EGG:open-wnn))
  1677.   (wnn-server-set-rev nil)
  1678.   (let*((kanji
  1679.      (remove-regexp-in-string "[\0-\37]" (buffer-substring start end)))
  1680.     (yomi (read-current-its-string
  1681.            (format (egg:msg-get 'jishotouroku-yomi) kanji))))
  1682.     (egg:toroku-word yomi kanji nil)))
  1683.  
  1684. (defun delete-space (string)
  1685.   (let ((len (length string)))
  1686.     (if (eq len 0) ""
  1687.       (if (or (char-equal (aref string 0) ? ) (char-equal (aref string 0) ?-)) 
  1688.       (delete-space (substring string 1))
  1689.     (concat (substring string 0 1) (delete-space (substring string 1)))))))
  1690.  
  1691.  
  1692. (defun toroku-henkan-mode ()
  1693.   (interactive)
  1694.   (let*((kanji      
  1695.      (read-current-its-string (egg:msg-get 'kanji)
  1696.                    (delete-space 
  1697.                 (buffer-substring (point) egg:*region-end* ))))
  1698.     (yomi (read-current-its-string
  1699.            (format (egg:msg-get 'jishotouroku-yomi) kanji)
  1700.            (let ((str "")
  1701.              (i *bunsetu-number*) 
  1702.              (max (wnn-server-bunsetu-suu)))
  1703.          (while (< i max)
  1704.            (setq str (concat str (car (wnn-server-bunsetu-yomi i)) ))
  1705.            (setq i (1+ i)))
  1706.          str))))
  1707.     (egg:toroku-word yomi kanji nil)))
  1708.  
  1709. ;;;
  1710. ;;; $B<-=qJT=87O(B DicEd
  1711. ;;;
  1712.  
  1713. (defvar *diced-window-configuration* nil)
  1714.  
  1715. (defvar *diced-dict-info* nil)
  1716.  
  1717. (defvar *diced-yomi* nil)
  1718.  
  1719. ;;;;;
  1720. ;;;;; User entry : edit-dict-item
  1721. ;;;;;
  1722.  
  1723. (defun edit-dict-item (yomi)
  1724.   (interactive (list (read-current-its-string (egg:msg-get 'yomi))))
  1725.   (if (null (wnn-server-isconnect)) (EGG:open-wnn))
  1726.   (wnn-server-set-rev nil)
  1727.   (let ((dict-info (wnn-server-word-search yomi))
  1728.     (current-wnn-server-type))
  1729.     (if (null dict-info)
  1730.     (message (egg:msg-get 'no-yomi) yomi)
  1731.       (progn
  1732.     (setq current-wnn-server-type wnn-server-type)
  1733.     (setq *diced-yomi* yomi)
  1734.     (setq *diced-window-configuration* (current-window-configuration))
  1735.     (pop-to-buffer "*Nihongo Dictionary Information*")
  1736.     (setq wnn-server-type current-wnn-server-type)
  1737.     (setq major-mode 'diced-mode)
  1738.     (setq mode-name "Diced")
  1739.     (setq mode-line-buffer-identification 
  1740.           (concat "DictEd: " yomi
  1741.               (make-string  (max 0 (- 17 (string-width yomi))) ?  )))
  1742.     (sit-for 0) ;; will redislay.
  1743.     ;;;(use-global-map diced-mode-map)
  1744.     (use-local-map diced-mode-map)
  1745.     (diced-display dict-info)
  1746.     ))))
  1747.  
  1748. (defun diced-redisplay ()
  1749.   (wnn-server-set-rev nil)
  1750.   (let ((dict-info (wnn-server-word-search *diced-yomi*)))
  1751.     (if (null dict-info)
  1752.     (progn
  1753.       (message (egg:msg-get 'no-yomi) *diced-yomi*)
  1754.       (diced-quit))
  1755.       (diced-display dict-info))))
  1756.  
  1757. (defun diced-display (dict-info)
  1758.     ;;; (values (list (record kanji bunpo hindo dict-number serial-number)))
  1759.     ;;;                         0     1     2      3           4
  1760.   (setq dict-info
  1761.     (sort dict-info
  1762.           (function (lambda (x y)
  1763.               (or (< (nth 1 x) (nth 1 y))
  1764.                   (if (= (nth 1 x) (nth 1 y))
  1765.                   (or (> (nth 2 x) (nth 2 y))
  1766.                       (if (= (nth 2 x) (nth 2 y))
  1767.                       (< (nth 3 x) (nth 3 y))))))))))
  1768.   (setq *diced-dict-info* dict-info)
  1769.   (setq buffer-read-only nil)
  1770.   (erase-buffer)
  1771.   (let ((l-kanji 
  1772.      (apply 'max
  1773.         (mapcar (function (lambda (l) (string-width (nth 0 l))))
  1774.             dict-info)))
  1775.     (l-bunpo
  1776.      (apply 'max
  1777.         (mapcar (function(lambda (l)
  1778.                    (string-width (wnn-server-hinsi-name (nth 1 l)))))
  1779.             dict-info)))
  1780.     (dict-list (wnn-server-dict-list))
  1781.     (writable-dict-list (wnn-server-hinsi-dicts -1)))
  1782.     (while dict-info
  1783.       (let*((kanji (nth 0 (car dict-info)))
  1784.         (bunpo (nth 1 (car dict-info)))
  1785.         (hinshi (wnn-server-hinsi-name bunpo))
  1786.         (hindo (nth 2 (car dict-info)))
  1787.         (dict-number (nth 3 (car dict-info)))
  1788.         (dict-name (wnn-dict-name dict-number dict-list))
  1789.         (sys-dict-p (null (memq dict-number writable-dict-list)))
  1790.         (serial-number (nth 4 (car dict-info))))
  1791.     (insert (if sys-dict-p " *" "  "))
  1792.     (insert kanji)
  1793.     (insert-char ?  
  1794.              (- (+ l-kanji 10) (string-width kanji)))
  1795.     (insert hinshi)
  1796.     (insert-char ?  (- (+ l-bunpo 2) (string-width hinshi)))
  1797.     (insert (egg:msg-get 'jisho) (file-name-nondirectory dict-name)
  1798.         "/" (int-to-string serial-number)
  1799.         (egg:msg-get 'hindo) (int-to-string hindo) ?\n )
  1800.     (setq dict-info (cdr dict-info))))
  1801.     (goto-char (point-min)))
  1802.   (setq buffer-read-only t))
  1803.  
  1804. (defun diced-add ()
  1805.   (interactive)
  1806.   (diced-execute t)
  1807.   (let*((kanji  (read-from-minibuffer (egg:msg-get 'kanji))))
  1808.     (egg:toroku-word *diced-yomi* kanji t)
  1809.     (diced-redisplay)))
  1810.           
  1811. (defun diced-delete ()
  1812.   (interactive)
  1813.   (beginning-of-line)
  1814.   (if (= (char-after (1+ (point))) ?* )
  1815.       (progn (message (egg:msg-get 'cannot-remove)) (beep))
  1816.     (if (= (following-char) ?  )
  1817.     (let ((buffer-read-only nil))
  1818.       (delete-char 1) (insert "D") (backward-char 1))
  1819.       )))
  1820.  
  1821.     
  1822. (defun diced-undelete ()
  1823.   (interactive)
  1824.   (beginning-of-line)
  1825.   (if (= (following-char) ?D)
  1826.       (let ((buffer-read-only nil))
  1827.     (delete-char 1) (insert " ") (backward-char 1))
  1828.     (beep)))
  1829.  
  1830. (defun diced-redisplay-hindo (dict-number serial-number)
  1831.   (let ((hindo))
  1832.     (setq buffer-read-only nil)
  1833.     (beginning-of-line)
  1834.     (re-search-forward "\\([0-9\-]+\\)\\(\n\\)")
  1835.     (delete-region (match-beginning 1) (match-end 1))
  1836.     (setq hindo (nth 3 (wnn-server-word-info dict-number serial-number)))
  1837.     (goto-char (match-beginning 1))
  1838.     (insert (int-to-string hindo))
  1839.     (beginning-of-line)
  1840.     (setq buffer-read-only t)))
  1841.  
  1842. (defun diced-use ()
  1843.   (interactive)
  1844.   (let* ((dict-item (nth 
  1845.              (+ (count-lines (point-min) (point))
  1846.             (if (= (current-column) 0) 1 0)
  1847.             -1)
  1848.             *diced-dict-info*))
  1849. ;     (hindo (nth 2 dict-item))
  1850.      (dict-number (nth 3 dict-item))
  1851.      (serial-number (nth 4 dict-item))
  1852.      )
  1853.     (if (null (wnn-server-word-use dict-number serial-number))
  1854.     (egg:error (wnn-server-get-msg)))
  1855.     (diced-redisplay-hindo dict-number serial-number)))
  1856.  
  1857. (defun diced-hindo-set (&optional newhindo)
  1858.   (interactive)
  1859.   (if (null newhindo)
  1860.       (setq newhindo (read-expression (egg:msg-get 'enter-hindo))))
  1861.   (let* ((dict-item (nth 
  1862.              (+ (count-lines (point-min) (point))
  1863.             (if (= (current-column) 0) 1 0)
  1864.             -1)
  1865.             *diced-dict-info*))
  1866. ;     (hindo (nth 2 dict-item))
  1867.      (dict-number (nth 3 dict-item))
  1868.      (serial-number (nth 4 dict-item))
  1869.      )
  1870.     (if (null (wnn-server-word-hindo-set dict-number serial-number newhindo))
  1871.     (egg:error (wnn-server-get-msg)))
  1872.     (diced-redisplay-hindo dict-number serial-number)))
  1873.  
  1874. (defun diced-quit ()
  1875.   (interactive)
  1876.   (setq buffer-read-only nil)
  1877.   (erase-buffer)
  1878.   (setq buffer-read-only t)
  1879.   (bury-buffer (get-buffer "*Nihongo Dictionary Information*"))
  1880.   (set-window-configuration *diced-window-configuration*)
  1881.   )
  1882.  
  1883. (defun diced-execute (&optional display)
  1884.   (interactive)
  1885.   (goto-char (point-min))
  1886.   (let ((no  0))
  1887.     (while (not (eobp))
  1888.       (if (= (following-char) ?D)
  1889.       (let* ((dict-item (nth no *diced-dict-info*))
  1890.          (kanji (nth 0 dict-item))
  1891.          (bunpo (nth 1 dict-item))
  1892.          (hinshi (wnn-server-hinsi-name bunpo))
  1893. ;         (hindo (nth 2 dict-item))
  1894.          (dict-number (nth 3 dict-item))
  1895.          (dict-name (wnn-dict-name dict-number (wnn-server-dict-list)))
  1896. ;         (sys-dict-p (null (memq dict-number (wnn-server-hinsi-dicts -1))))
  1897.          (serial-number (nth 4 dict-item))
  1898.          )
  1899.         (if (notify-yes-or-no-p (egg:msg-get 'remove-notify)
  1900.                 kanji hinshi dict-name)
  1901.         (progn
  1902.           (if (wnn-server-word-delete dict-number serial-number)
  1903.               (notify (egg:msg-get 'removed)
  1904.                   kanji hinshi dict-name)
  1905.             (egg:error (wnn-server-get-msg)))
  1906.           ))))
  1907.       (setq no (1+ no))
  1908.       (forward-line 1)))
  1909.   (forward-line -1)
  1910.   (if (not display) (diced-redisplay)))
  1911.  
  1912. (defun diced-next-line ()
  1913.   (interactive)
  1914.   (beginning-of-line)
  1915.   (forward-line 1)
  1916.   (if (eobp) (progn (beep) (forward-line -1))))
  1917.  
  1918. (defun diced-end-of-buffer ()
  1919.   (interactive)
  1920.   (goto-char (point-max))
  1921.   (forward-line -1))
  1922.  
  1923. (defun diced-scroll-down ()
  1924.   (interactive)
  1925.   (scroll-down)
  1926.   (if (eobp) (forward-line -1)))
  1927.  
  1928. (defun diced-mode ()
  1929.   "Mode for \"editing\" Wnn dictionaries.
  1930. In diced, you are \"editing\" a list of the entries in dictionaries.
  1931. You can move using the usual cursor motion commands.
  1932. Letters no longer insert themselves. Instead, 
  1933.  
  1934. Type  a to Add new entry.
  1935. Type  d to flag an entry for Deletion.
  1936. Type  n to move cursor to Next entry.
  1937. Type  p to move cursor to Previous entry.
  1938. Type  q to Quit from DicEd.
  1939. Type  C-u to Toggle the word to use/unuse.
  1940. Type  u to Unflag an entry (remove its D flag).
  1941. Type  x to eXecute the deletions requested.
  1942. "
  1943.   )
  1944.  
  1945. (defvar diced-mode-map (let ((map (make-sparse-keymap))) (suppress-keymap map) map))
  1946.  
  1947. (define-key diced-mode-map "a"    'diced-add)
  1948. (define-key diced-mode-map "d"    'diced-delete)
  1949. (define-key diced-mode-map "n"    'diced-next-line)
  1950. (define-key diced-mode-map "p"    'previous-line)
  1951. (define-key diced-mode-map "q"    'diced-quit)
  1952. ;(define-key diced-mode-map "t"    'diced-use)
  1953. (define-key diced-mode-map "u"    'diced-undelete)
  1954. (define-key diced-mode-map "x"    'diced-execute)
  1955.  
  1956. (define-key diced-mode-map "\C-h" 'help-command)
  1957. (define-key diced-mode-map "\C-n" 'diced-next-line)
  1958. (define-key diced-mode-map "\C-p" 'previous-line)
  1959. (define-key diced-mode-map "\C-u" 'diced-use)
  1960. (define-key diced-mode-map "\C-v" 'scroll-up)
  1961. (define-key diced-mode-map "\eh"  'diced-hindo-set)
  1962. (define-key diced-mode-map "\e<"  'beginning-of-buffer)
  1963. (define-key diced-mode-map "\e>"  'diced-end-of-buffer)
  1964. (define-key diced-mode-map "\ev"  'diced-scroll-down)
  1965.  
  1966. (define-key diced-mode-map [up] 'previous-line)
  1967. (define-key diced-mode-map [down] 'diced-next-line)
  1968.  
  1969.  
  1970. ;;;
  1971. ;;; set comment on dictionary
  1972. ;;;
  1973.  
  1974. (defun set-dict-comment ()
  1975.   (interactive)
  1976.   (if (null (wnn-server-isconnect)) (EGG:open-wnn))
  1977.   (wnn-server-set-rev nil)
  1978.   (let*((dic-list (wnn-server-dict-list))
  1979.     (writable-dic-list (wnn-server-hinsi-dicts -1))
  1980.     (dict-number
  1981.      (menu:select-from-menu
  1982.       (list 'menu (egg:msg-get 'jishomei)
  1983.         (mapcar '(lambda (x)
  1984.                (let ((y (assoc x dic-list)))
  1985.                  (cons (nth 1 y) (nth 0 y))))
  1986.             writable-dic-list))))
  1987.     (comment (read-from-minibuffer (egg:msg-get 'comment)
  1988.                        (wnn-dict-name dict-number dic-list))))
  1989.     (if (wnn-server-dict-comment dict-number comment)
  1990.     (notify (egg:msg-get 'jisho-comment)
  1991.         (wnn-dict-name dict-number dic-list) comment)
  1992.       (egg:error (wnn-server-get-msg)))))
  1993.  
  1994.  
  1995. ;;;
  1996. ;;; Pure inspect facility
  1997. ;;;
  1998.  
  1999. (defun henkan-inspect-bunsetu ()
  2000.   (interactive)
  2001.   (let ((info (wnn-server-inspect *bunsetu-number*)))
  2002.     (if (null info)
  2003.     (notify (wnn-server-get-msg))
  2004.       (progn
  2005.     (let ((dic-list (wnn-server-dict-list)))
  2006.       (if (null dic-list)
  2007.           (notify (wnn-server-get-msg))
  2008.         (progn
  2009.           (let ((hinsi (wnn-server-hinsi-name (nth 4 info)))
  2010.             (kanji (nth 0 info))
  2011.             (yomi (nth 1 info))
  2012.             (serial   (nth 3 info))
  2013.             (hindo    (nth 5 info))
  2014.             (jisho (wnn-dict-name (nth 2 info) dic-list))
  2015.             (ima (nth 6 info))
  2016.             (hyoka (nth 7 info))
  2017.             (daihyoka (nth 8 info))
  2018.             (kangovect (nth 9 info)))
  2019.         (notify-internal
  2020.          (format "%s %s(%s %s:%s Freq:%s%s) S:%s D:%s V:%s "
  2021.              kanji yomi hinsi jisho serial 
  2022.              (if (= ima 1) "*" " ")
  2023.              hindo hyoka daihyoka kangovect)
  2024.          t)))))))))
  2025.  
  2026. (provide 'egg-wnn)
  2027.  
  2028. ;;; egg-wnn.el ends here
  2029.